Skip to topic | Skip to bottom
Home
Public


Currently logged in as TWikiGuest?

Searched: \.*
Results from Public web

The 25 most difficult questions you'll be asked on a job interview

From http://www.datsi.fi.upm.es/~frosal/docs/25mdq.html

As Reprinted from FOCUS Magazine -- January 5, 1983

If you are one of those executive types unhappy at your present post and embarking on a New Year's resolution to find a new one, here's a helping hand. The job interview is considered to be the most critical aspect of every expedition that brings you face-to- face with the future boss. One must prepare for it with the same tenacity and quickness as one does for a fencing tournament or a chess match.

This article has been excerpted from "PARTING COMPANY: How to Survive the Loss of a Job and Find Another Successfully" by William J. Morin and James C. Cabrera. Copyright by Drake Beam Morin, inc. Publised by Harcourt Brace Jovanovich.

Morin is chairman and Cabrera is president of New York-based Drake Beam Morin, nation's major outplacement firm, which has opened offices in Philadelphia.

1. Tell me about yourself.

Since this is often the opening question in an interview, be extracareful that you don't run off at the mouth. Keep your answer to a minute or two at most. Cover four topics: early years, education, work history, and recent career experience. Emphasize this last subject. Remember that this is likely to be a warm-up question. Don't waste your best points on it.

2. What do you know about our organization?

You should be able to discuss products or services, revenues, reputation, image, goals, problems, management style, people, history and philosophy. But don't act as if you know everything about the place. Let your answer show that you have taken the time to do some research, but don't overwhelm the interviewer, and make it clear that you wish to learn more.

You might start your answer in this manner: "In my job search, I've investigated a number of companies.

Yours is one of the few that interests me, for these reasons..."

Give your answer a positive tone. Don't say, "Well, everyone tells me that you're in all sorts of trouble, and that's why I'm here", even if that is why you're there.

3. Why do you want to work for us?

The deadliest answer you can give is "Because I like people." What else would you like-animals?

Here, and throughout the interview, a good answer comes from having done your homework so that you can speak in terms of the company's needs. You might say that your research has shown that the company is doing things you would like to be involved with, and that it's doing them in ways that greatly interest you. For example, if the organization is known for strong management, your answer should mention that fact and show that you would like to be a part of that team. If the company places a great deal of emphasis on research and development, emphasize the fact that you want to create new things and that you know this is a place in which such activity is encouraged. If the organization stresses financial controls, your answer should mention a reverence for numbers.

If you feel that you have to concoct an answer to this question - if, for example, the company stresses research, and you feel that you should mention it even though it really doesn't interest you- then you probably should not be taking that interview, because you probably shouldn't be considering a job with that organization.

Your homework should include learning enough about the company to avoid approaching places where you wouldn't be able -or wouldn't want- to function. Since most of us are poor liars, it's difficult to con anyone in an interview. But even if you should succeed at it, your prize is a job you don't really want.

4. What can you do for us that someone else can't?

Here you have every right, and perhaps an obligation, to toot your own horn and be a bit egotistical. Talk about your record of getting things done, and mention specifics from your resume or list of career accomplishments. Say that your skills and interests, combined with this history of getting results, make you valuable. Mention your ability to set priorities, identify problems, and use your experience and energy to solve them.

5. What do you find most attractive about this position? What seems least attractive about it?

List three or four attractive factors of the job, and mention a single, minor, unattractive item.

6. Why should we hire you?

Create your answer by thinking in terms of your ability, your experience, and your energy. (See question 4.)

7. What do you look for in a job?

Keep your answer oriented to opportunities at this organization. Talk about your desire to perform and be recognized for your contributions. Make your answer oriented toward opportunity rather than personal security.

8. Please give me your defintion of [the position for which you are being interviewed].

Keep your answer brief and taskoriented. Think in in terms of responsibilities and accountability. Make sure that you really do understand what the position involves before you attempt an answer. If you are not certain. ask the interviewer; he or she may answer the question for you.

9. How long would it take you to make a meaningful contribution to our firm?

Be realistic. Say that, while you would expect to meet pressing demands and pull your own weight from the first day, it might take six months to a year before you could expect to know the organization and its needs well enough to make a major contribution.

10. How long would you stay with us?

Say that you are interested in a career with the organization, but admit that you would have to continue to feel challenged to remain with any organization. Think in terms of, "As long as we both feel achievement-oriented."

11. Your resume suggests that you may be over-qualified or too experienced for this position. What's Your opinion?

Emphasize your interest in establishing a long-term association with the organization, and say that you assume that if you perform well in his job, new opportunities will open up for you. Mention that a strong company needs a strong staff. Observe that experienced executives are always at a premium. Suggest that since you are so wellqualified, the employer will get a fast return on his investment. Say that a growing, energetic company can never have too much talent.

12. What is your management style?

You should know enough about the company's style to know that your management style will complement it. Possible styles include: task oriented (I'll enjoy problem-solving identifying what's wrong, choosing a solution and implementing it"), results-oriented ("Every management decision I make is determined by how it will affect the bottom line"), or even paternalistic ("I'm committed to taking care of my subordinates and pointing them in the right direction").

A participative style is currently quite popular: an open-door method of managing in which you get things done by motivating people and delegating responsibility.

As you consider this question, think about whether your style will let you work hatppily and effectively within the organization.

13. Are you a good manager? Can you give me some examples? Do you feel that you have top managerial potential?

Keep your answer achievementand ask-oriented. Rely on examples from your career to buttress your argument. Stress your experience and your energy.

14. What do you look for when You hire people?

Think in terms of skills. initiative, and the adaptability to be able to work comfortably and effectively with others. Mention that you like to hire people who appear capable of moving up in the organization.

15. Have you ever had to fire people? What were the reasons, and how did you handle the situation?

Admit that the situation was not easy, but say that it worked out well, both for the company and, you think, for the individual. Show that, like anyone else, you don't enjoy unpleasant tasks but that you can resolve them efficiently and -in the case of firing someone- humanely.

16. What do you think is the most difficult thing about being a manager or executive?

Mention planning, execution, and cost-control. The most difficult task is to motivate and manage employess to get something planned and completed on time and within the budget.

17. What important trends do you see in our industry?

Be prepared with two or three trends that illustrate how well you understand your industry. You might consider technological challenges or opportunities, economic conditions, or even regulatory demands as you collect your thoughts about the direction in which your business is heading.

18. Why are you leaving (did you leave) your present (last) job?

Be brief, to the point, and as honest as you can without hurting yourself. Refer back to the planning phase of your job search. where you considered this topic as you set your reference statements. If you were laid off in an across-the-board cutback, say so; otherwise, indicate that the move was your decision, the result of your action. Do not mention personality conflicts.

The interviewer may spend some time probing you on this issue, particularly if it is clear that you were terminated. The "We agreed to disagree" approach may be useful. Remember hat your references are likely to be checked, so don't concoct a story for an interview.

19. How do you feel about leaving all your benefits to find a new job?

Mention that you are concerned, naturally, but not panicked. You are willing to accept some risk to find the right job for yourself. Don't suggest that security might interest you more than getting the job done successfully.

20. In your current (last) position, what features do (did) you like the most? The least?

Be careful and be positive. Describe more features that you liked than disliked. Don't cite personality problems. If you make your last job sound terrible, an interviewer may wonder why you remained there until now.

21. What do you think of your boss?

Be as positive as you can. A potential boss is likely to wonder if you might talk about him in similar terms at some point in the future.

22. Why aren't you earning more at your age?

Say that this is one reason that you are conducting this job search. Don't be defensive.

23. What do you feel this position should pay?

Salary is a delicate topic. We suggest that you defer tying yourself to a precise figure for as long as you can do so politely. You might say, "I understand that the range for this job is between $______ and $______. That seems appropriate for the job as I understand it." You might answer the question with a question: "Perhaps you can help me on this one. Can you tell me if there is a range for similar jobs in the organization?"

If you are asked the question during an initial screening interview, you might say that you feel you need to know more about the position's responsibilities before you could give a meaningful answer to that question. Here, too, either by asking the interviewer or search executive (if one is involved), or in research done as part of your homework, you can try to find out whether there is a salary grade attached to the job. If there is, and if you can live with it, say that the range seems right to you.

If the interviewer continues to probe, you might say, "You know that I'm making $______ now. Like everyone else, I'd like to improve on that figure, but my major interest is with the job itself." Remember that the act of taking a new job does not, in and of itself, make you worth more money.

If a search firm is involved, your contact there may be able to help with the salary question. He or she may even be able to run interference for you. If, for instance, he tells you what the position pays, and you tell him that you are earning that amount now and would Like to do a bit better, he might go back to the employer and propose that you be offered an additional 10%.

If no price range is attached to the job, and the interviewer continues to press the subject, then you will have to restpond with a number. You cannot leave the impression that it does not really matter, that you'll accept whatever is offered. If you've been making $80,000 a year, you can't say that a $35,000 figure would be fine without sounding as if you've given up on yourself. (If you are making a radical career change, however, this kind of disparity may be more reasonable and understandable.)

Don't sell yourself short, but continue to stress the fact that the job itself is the most important thing in your mind. The interviewer may be trying to determine just how much you want the job. Don't leave the impression that money is the only thing that is important to you. Link questions of salary to the work itself.

But whenever possible, say as little as you can about salary until you reach the "final" stage of the interview process. At that point, you know that the company is genuinely interested in you and that it is likely to be flexible in salary negotiations.

24. What are your long-range goals?

Refer back to the planning phase of your job search. Don't answer, "I want the job you've advertised." Relate your goals to the company you are interviewing: 'in a firm like yours, I would like to..."

25. How successful do you you've been so far?

Say that, all-in-all, you're happy with the way your career has progressed so far. Given the normal ups and downs of life, you feel that you've done quite well and have no complaints.

Present a positive and confident picture of yourself, but don't overstate your case. An answer like, "Everything's wonderful! I can't think of a time when things were going better! I'm overjoyed!" is likely to make an interviewer wonder whether you're trying to fool him . . . or yourself. The most convincing confidence is usually quiet confidence.

-- KevinJarnot - 10 Feb 2005

61 Ways to Fight Fat

From http://www.muscleandfitness.com/training/53

M&F shares the secrets to shedding fat and getting lean with our comprehensive guide

Story by: Bill Geiger and Eric Velazquez How do I lose thee? Let me count the ways. We give you 61 (plus a few bonus tips for you dedicated online readers). Losing those last few inches, bringing out that six-pack or moving the slider to the left on the scale are among the hardest things for people to do — even you crafty gym veterans. But with this compilation of tips, unwanted bodyfat could be a thing of the past.

WEIGHT TRAINING

Be an Iron Man. There’s no overstating the importance of resistance training. Adding muscle to your frame through lifting weights causes your body to speed up its metabolism. For every pound of lean muscle you forge, count on losing an extra 35–50 calories per day, or up to 1,500 calories a month or 18,000 calories per year while resting. That’s approximately 5 pounds of bodyfat you can eliminate at rest.

FAT FACT: Depending on a number of factors — weight loads, rest periods, intensity, exercise selection, etc. — the average weight-training session will yield a caloric burn of 400–600 calories.

Limit rest periods. Don’t spend your time between sets chatting up the chick on the treadmill. To add a calorie-burning element to your weight training, limit rest periods to 30–45 seconds. Resting 30 seconds between sets has been shown to increase caloric burn by 50%, compared to a three-minute rest period. You may not be as strong heading into your next set, but the added calorie burn may be worth it.

Speed up the pace. To help amp up your calorie burn between sets — and to accomplish more in less time — incorporate supersets or drop sets on weight-training days or perform your exercises circuit-style. You can also speed up your workout by doing your ab moves between other exercises, rather than waiting until the end of your routine.

Expect progression. Don’t get stuck in a rut with the same weights and exercises. Expect that after 4–6 weeks, your body will have adjusted and will be starving for something new. Aim to make incremental increases to your weight loads, try new exercises, shorten rest periods, incorporate advanced techniques like supersets, change from barbells to dumbbells…anything to keep your body guessing and improving.

Compound interest. Build your routine around multijoint movements like presses, rows and squats to recruit the most muscle and burn the most calories. Isolation moves, or single-joint exercises, such as leg extensions, biceps curls and triceps extensions, should represent only a small portion of your routine.

Be free. Free weights force your body to recruit more total muscle because they call on stabilizer muscles to balance the weight, a superior advantage to the predetermined range of motion that machines have to offer.

Go rest, young man. To repair itself (which is where the real gains occur), the body needs rest. Get at least eight hours of sleep per night to allow your body to recover and grow muscle, which ups your overall calorie-burning potential. And depending on the volume of your training, allow a few days before working the same muscle group again. This also prevents overtraining, which can strip your body of muscle.

Go for the afterburn. Resistance training also burns more calories after exercise. One study found that after a 30-minute full-body workout in which subjects trained with their 10RM weights, resting metabolic rate was elevated by 20% for two days following the exercise session. In a 180-pound man, that percentage equates to an average 400 extra calories burned per day.

Overload. Training with the progressive-overload principle helps rev your metabolism. Pushing your muscles beyond what they’re currently trained to overcome forces them to adapt and regenerate themselves so they’re ready the next time such a stimulus is encountered.

Think “Ronnie.” Train like a bodybuilder to help improve your hormonal milieu. Doing 3–5 sets of 8–12 reps with relatively short rest periods has been shown to increase testosterone and growth hormone release, improving your anabolic environment and metabolism.

Train abs for endurance. If your goal is to have a slimmer waistline, don’t train your abs with heavy loads. Use a weight that allows you to get at least 15 reps per set, allowing minimal rest between sets (less than 60 seconds). Or use only your own bodyweight as resistance while maximally contracting your abs on each repetition.

Cyclical gains. Although it isn’t impossible, you shouldn’t attempt to get really lean and gain significant amounts of muscle mass simultaneously. Instead, periodize (cycle) your training for better overall results, alternating between phases when you focus on strength, mass and leaning out.

CARDIO

Cardio, cardio, cardio. This helps you with the simple philosophy behind fat loss: Burn more calories than you take in. If your goal is fat loss, incorporate 4–6, 30–60-minute sessions per week into your training schedule.

Of iron and sweat. If your goal is to lean out, follow your weight training with cardio. Since lifting depletes glycogen stores, your body is more likely to use fat as its first fuel source during cardio. Also, the combination of the two results in a higher caloric burn postworkout.

Tread heavily. What’s the best exercise and intensity to burn maximal fat? Researchers found that jogging on the treadmill at about 70% of your maximal heart rate, or MHR (subtract your age from 220 and multiply by 0.7 for your heart rate in beats per minute), was optimal, burning about 40 grams of fat per hour of exercise. Going above or below this intensity burned significantly less fat, as did pedaling on a stationary cycle, regardless of intensity.

Run hungry. If you can stomach getting up earlier, perform cardio before your first meal of the day. Your body is most likely to use fat as the first energy source because your glycogen stores are depleted. If you’re concerned with muscle loss, take 10–20 grams of whey protein before your session, but stay away from carbs.

Post-cardio burn. Following aerobic exercise, your resting metabolic rate remains elevated for anywhere from 60 minutes to about 12 hours, depending on the intensity and duration of the exercise session.

Move outdoors. Try your next outdoor run on sand, which is more difficult than running on harder surfaces like cement. It’s easier on the joints as well, but wear shoes to avoid stress fractures and protect your feet from glass. Running on grass is also a welcome relief to joints and arches.

Taper off. Instead of starting slow and building up speed, do your high-intensity cardio early in your workout and taper off to a slow finish to burn significantly more fat. After a 2–3-minute warm-up, immediately kick it into high gear (80%–85% max heart rate) for 15–20 minutes before slowing down (60%–65% max heart rate) for the last 10–20 minutes.

Vary your cardio. Whether you’re lifting weights or doing cardio, the trick is to keep your body from adapting to what you’re doing. Regularly changing your cardio mode is the best way to keep your body responding to your efforts.

Interval for success. Unless you’re a highly conditioned athlete, you can’t maintain a very intense pace for very long, so the best way to improve your aerobic fitness and burn fat is with intervals. That is, you alternate very intense periods of work with lower-intensity sessions in which you recover.

No butts. Smoking deprives cells of the oxygen they need to maximize metabolism, keeps muscles from repairing themselves after exercise and makes cardio a lot tougher. Plus, your smoke-scented clothes are sure to irritate fellow gym rats.

Fidget to fight fat. Are you a fidgeter? Maybe you should be. Several studies have shown that toe-tappers, while completely annoying at the office, will burn more calories over the course of the day than the stationary man.

NUTRITION

Stay hydrated. Active individuals actually require more water and should aim to consume roughly 1 gallon per day to avoid becoming dehydrated. And if you’re one of those people who hates drinking water, consider this: Dehydrated individuals burn less fat than their well-watered counterparts.

Eat more frequently. Eating 5–6 small meals a day as opposed to “three squares a day” causes your metabolism to work constantly. Eating larger meals, on the other hand, slows your metabolism and forces leftover calories to be stored as fat.

Eat protein. Since muscle-building is the fastest route to slim down, you want to make sure that your protein consumption is enough to keep up with your weight training. Eat too little protein and your gains could be much slower. Get 1–1.5 grams of protein per pound of bodyweight per day to help your muscle gains along. Use protein bars and shakes to supplement your whole-food consumption and stave off cravings.

Get leafy. Those who eat a salad before dinner tend to consume less calories overall during dinner. But don’t sabotage yourself — stay away from high-fat dressings like ranch, blue cheese and Caesar.

Skip happy hour. Alcohol consumption can temporarily blunt testosterone levels, hindering muscle repair and growth and blunting sexual drive. Also, the calories from alcoholic beverages — in the neighborhood of 100–200 each without cocktail mixers — add up faster than you may think.

Cut out soda. Instead, rely on water and other flavored drinks like Crystal Light to get your fluids every day. If you drink one soda per day, you’re adding 1,750 calories per week to your diet. Also, studies have shown that those who regularly consume diet sodas tend to gain weight in the long run because of overindulgences elsewhere.

Calories out! The goal in any fat-loss or weight-loss program should be to burn more calories than you consume. Aim to cut total calorie consumption by about 250 calories per day. Yes, that means you’ll have to figure out how many calories you eat in a normal day. Get on it. The math will pay big dividends later.

Got the munchies? If you can do without the butter and salt, plain popcorn is a winner. Two quarts has the same number of calories as just 20 potato chips. By substituting 1 cup of plain, unbuttered popcorn for a 1-ounce bag of chips, you’ll save 135 calories and 10 grams of fat.

The magical fruit. Subjects who ate half of a grapefruit with meals or drank 8 ounces of grapefruit juice three times a day lost 4 pounds (with some losing more than 10 pounds) in 12 weeks without dieting.

Carb smart. Keep your carbohydrates low to moderate when trying to lose weight. If you rotate low- and high-carb days, you’ll be able to keep your energy levels up while running a caloric deficit. Good, clean, fiber-rich carbs include oats, potatoes, rice and whole-grain bread. Also, limit high-carb drinks like fruit juice to postworkout, when your body needs carbs to speed recovery.

Operation Dinner Out. Be diligent when ordering in a restaurant. Have your meats grilled without oil or grease. Ask for steamed vegetables with no butter. Get a salad (no cheese) with either low-fat dressing or vinaigrette.

Avoid simple sugars. Too much sugar in your diet can wreak havoc on your metabolism by spiking your insulin response and promoting the accumulation of bodyfat over time. Immediately after exercise, however, is an ideal time to ingest simple sugars; otherwise, steer clear.

GI Low. For most of the day, your carb options should be of the low-glycemic variety, meaning they’re digested and burned more slowly. Athletes who eat low-GI carbs burn more fat throughout the day.

Eat more fiber. Fiber, both soluble and insoluble, is essential to health and helps decrease bodyfat. Adults should consume 35–40 grams of fiber per day, with about a third of that coming from insoluble fibrous sources. Along with whole grains rich in beneficial fiber, consume high amounts of fibrous vegetables, such as broccoli, to attain your daily intake. High-fiber foods also promote satiety.

Timed consumption. When you eat is just as important as what you eat. Many people who eat way too much at night should re-evaluate their eating patterns. Eat two-thirds of your day’s calories before dinnertime to avoid overeating late in the day.

Prepare. Watch what you eat around work. If your workplace serves nothing healthy, tote food or snacks along with you. If you’re attending a workplace function in which only junk food is served, pre-eat. Having recently eaten something that’s healthy and adequate in calories to meet your energy needs, it’s easier to say no to the junk and empty calories.

Get yolked. Eating eggs for breakfast was recently found to reduce hunger and food intake for up to 24 hours.

Slow down, Turbo! Successful dieters and fitness buffs will tell you that fast eating and bodyfat go hand in hand because you end up overeating. It takes about 10 minutes for the food in your stomach to signal your brain that you’ve eaten enough.

Don’t be salty. Excess sodium consumption can make you look softer and cause you to burn less fat. Most people get way too much, anyway, especially if you eat a lot of processed foods. To help you look leaner and strip sodium from your diet, drink more water, cut back on highly processed foods and switch to potassium chloride to season your foods.

Got milk? Research has shown that individuals who consume high levels of dietary calcium in a 24-hour period had higher rates of fat oxidation that day than those who consumed lesser amounts. So stock up on low-fat versions of cheese, milk and yogurt; if you’re lactose intolerant, choose dark-green leafy vegetables, legumes and almonds.

Go nuts! Eating a handful of almonds was found to help test subjects lose 62% more weight, 56% more fat and 50% more from their waistline after 24 weeks compared to those who followed the same diet without almonds.

SUPPLEMENTATION

Invest in a fat-burner. Consult your doctor before trying a fat-burner if you have any pre-existing medical conditions such as asthma or high blood pressure, as fat-burners can exacerbate those conditions. New products that combine multiple ingredients, such as Hydroxycut Hardcore and Lipid Fx, work well.

Have a tea party. Green tea, in beverage or capsule form, is a reliable fat-burning aid and is generally safe for most people.

Caffeinate. Drinking coffee before cardio will cause you to burn more fat. Subjects who consumed 300 mg of caffeine two hours before exercising on a stationary bike for 30 minutes were not only able to work out at a higher intensity (more total calories burned) but they also used a much greater percentage of bodyfat for fuel.

Aminos work, too. Researchers found that subjects who ingested about 3 grams of an amino acid mixture before one hour of moderate-intensity exercise on a stationary bike burned the same amount of total calories but more fat than those taking a placebo drink.

The Transporter. Carnitine, which helps transport fats to where they can be burned in the mitochondria of muscle and other cells, can help you burn more fat. One study showed that three weeks of carnitine supplementation increased carnitine levels in muscle and enhanced fat usage during exercise. Another study showed that just 10 days of carnitine supplementation (3 grams per day) increased the amount of fat burned.

Fat for fuel faster. Hydroxycitrate (HCA) appears to enhance fat loss, according to researchers. Subjects taking HCA were able to work out longer and harder, and the amount of calories they burned from fat during the hour of exercise increased. Try taking 250–1,000 mg once or twice a day.

Builder/burner. Creatine not only helps build muscle but can aid in bodyfat loss. Soldiers who took creatine (as opposed to the group that got a placebo) increased strength and muscle mass, but also averaged a 0.5% reduction in bodyfat percentage, with several subjects dropping more than 1% bodyfat.

Take CLA. Conjugated linoleic acid has come into vogue in bodybuilding circles as a fat-burner. Several studies in humans have shown modest effects on fat loss. Try 3 grams per day.

MOTIVATION

Recruit a partner. Weight training with the right partner can help push and motivate you beyond what you’d achieve on your own. He or she can also be a positive and healthy source of competition, if that’s a characteristic that helps drive you in accomplishing specific goals.

Discipline. Tired of how you look? Then understand you’re the only one who can change it. Resolve to do it and do it. Create a plan and carry it out, budgeting time for the gym, food prep and rest for the week.

But be flexible. While you should be rigid about your workout times and food intake, don’t lock yourself into lofty goals such as “I will lose 10 pounds in my first two weeks.” You’re setting yourself up for a fall. Instead, aim to shed up to 2 pounds per week after weeks 4–5. Anything earlier or greater than that should be the fat-free icing on your cake!

Be a fitness nerd. Watch and read everything you can get your hands on (such as Muscle & Fitness) to learn more about the body, exercise and nutrition. The more you know, the better off you’ll be in the gym.

Join a league or run a race. Many people lack the drive to keep to a regular routine. Giving yourself a reason to get into shape (or stay that way) is a great way to stay on course with your goals. Signing up for a 10K or joining a league in your favorite sport is often motivation enough not to miss your next gym session.

Cheat. To avoid going insane with anger over what you can or can’t eat, allow yourself 1–2 cheat meals per week, depending on how dedicated you can be. Small indulgences make dieting more tolerable, keeping you on track longer.

Stay the course. The watchword for taking off that extra layer of bodyfat is consistency. Stick with it, even if the first week or two are tough — by the third week, you’ll start to form a habit.

Be goal-oriented. To succeed, keep track of your goals. Make them attainable, and write them down to increase your chances of success. Set small goals — such as dropping 5 pounds or losing 2 inches off your waist — that are measurable and attainable. Once you hit those goals, set new ones to keep yourself motivated.

Picture this. Get motivated by hanging up a picture of yourself today next to one from a magazine of what you want to look like. Dream big, but be realistic: You can have a far-improved physique in a month, but more dramatic changes take more time.

Chart progress. Weigh yourself naked just once per week, at the same time of day, preferably on the same scale to ensure accuracy. M&F

-- KevinJarnot - 26 May 2006

REGEDIT4

;  This adds the ability to Right-Click on a .dll or .ocx
;  and get the Register / UnRegister options.

; ==========
; .DLL files
; ==========

[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"

[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"

[HKEY_CLASSES_ROOT\dllfile\Shell\Register\command]
@="regsvr32.exe \"%1\""

[HKEY_CLASSES_ROOT\dllfile\Shell\UnRegister\command]
@="regsvr32.exe /u \"%1\""

; ==========
; .OCX files
; ==========

[HKEY_CLASSES_ROOT\.ocx]
@="ocxfile"

[HKEY_CLASSES_ROOT\ocxfile]
@="OCX"

[HKEY_CLASSES_ROOT\ocxfile\Shell\Register\command]
@="regsvr32.exe \"%1\""

[HKEY_CLASSES_ROOT\ocxfile\Shell\UnRegister\command]
@="regsvr32.exe /u \"%1\""

; End
-- KevinJarnot - 24 May 2005

Programs not showing up in Add/Remove Programs

(from LangaList - http://search.atomz.com/search/?sp-q=SYSOC&sp-a=0008002a-sp00000000)

It is fairly common for an installer to not show the removal option in the Add/Remove applet in XP.

The solution for an individual app may be to go in to the registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall and look for the application name, such as IBM Rapid Restore Ultra

and a value listed as "SystemComponent"=dword:00000000

If the value is 1, it is hidden, but if it is 0, it is shown in the applet.

Most Windows installers are found in the hidden Windows/Installer folder. To figure out which MSI is for which application, permitting uninstall or repair of installation, pass cursor over file and look at tool tip, or select file and look in status bar.

And:

Uninstall "Hidden" Windows Components Apparently, Microsoft didn't want you to be able to remove some apps. You can editing the SYSOC.INF file, which is located in the C:\WINDOWS [or your Windows XP directory]\INF folder. Open it with Notepad or another editor.

Under the [Components] heading, you'll see a whole bunch of parameters for various Windows applets. Some of them contain the word "hide." Those particular programs, which include Windows Messenger (msmsgs), Terminal Server, Pinball, and others, are installed on your XP system, but their entries are hidden from and Add/Remove dialog.

To remove Windows Messenger, edit hide out of the line that reads

msmsgs=msgrocm.dll,OcEntry,msmsgs.inf,hide,7

so that it looks like this:

msmsgs=msgrocm.dll,OcEntry,msmsgs.inf,7

Save the file, close it, and open the Add/Remove Program applet. Click on Windows Components button and you'll see Windows Messenger listed. Uncheck it and click Next to purge that silly program from your system.

Feel free to edit hide everywhere it appears in the SYSOC.INF file to reveal other removable Windows XP components.

-- KevinJarnot - 09 Dec 2004

Agile Development

Notes

  • Pg 9 - "the phenomenon of communication does not depend on what is transmitted, but on what happens to the person who receives it. And this is a very different matter from "transmitting information".
  • Pg 14 - 3 levels of learning
    • following
    • detaching
    • fluent

-- KevinJarnot - 30 Jan 2005

Some notes for an analysis of DIY vs Managed vs Colo web hosting

What infrastructure is required for a web hosting facility?

  • Real estate and Equipment - server room, racks, cabinets, etc.
  • Electrical Power - requires sufficient conditioned power
  • UPS and/or Diesel Generator - enough UPSs and/or diesel generators to provide power to servers and A/C for four - eight hours should there be a power failure
  • Air Conditioning - at least two A/C systems, each running at 50% capacity. Should chill room to 70 degrees.
  • Physical Security - keycard, biometric, etc. Colo should have "guards" at door. Managed should not allow non-employees into server area.
  • Fire Suppression -
  • Internet Connectivity - multiple redundant pipes from multiple providers. All pipes at least DS-3 (T3).

Pricing for DIY

Item Price Desc
Racks/cabs Assume 2 2000
UPS Big suckers 20000
A/C can get away with 2 portables 800
Keycard basic system 5000
Fire supression unk 0
Internet assume two DS-3 lines, $5000/month each 112000
    139800

-- KevinJarnot - 18 Jan 2005

Asthma

Links

Info

  • Advair
    • Combination of salmeterol and fluticasone
    • Opens the airways in the lung by relaxing smooth muscle around the airways
    • Prevents inflammation and reduces swelling inside the airways
    • FDA Medwatch warning
    • Revised Advair label
    • Side effects: (see http://medications.com/go/se/Advair)
      • Thrush (you must rinse mouth after use)
      • Muscle cramping (robs sodium from muscles) DONE
      • Weight gain (?)
      • Pimply rash on stomach and back DONE
      • Upper back pain DONE
      • Tachycardia DONE
      • Sweating DONE

-- KevinJarnot - 06 Feb 2005

AutoIt

Open Source BASIC-like scripting language designed for automating the Windows GUI.

From their home page:

AutoIt v3 is an opensource BASIC-like scripting language designed for automating the Windows GUI. It uses a combination of simulated keystrokes, mouse movement and window/control manipulation in order to automate tasks in a way not possible or reliable with other languages (e.g. VBScript and SendKeys).

AutoIt was initially designed for PC "roll out" situations to configure thousands of PCs, but with the arrival of v3 it is also well suited to performing home automation and the scripting of repetitive tasks.

AutoIt can:

  • Provide a general-purpose scripting language
  • Execute Windows and DOS executables
  • Simulate keystrokes (supports most keyboard layouts)
  • Simulate mouse movements and clicks
  • Move, resize and manipulate windows
  • Interact directly with "controls" on a window (set/get text from edit controls, check boxes and radio buttons, select items in drop-down lists, etc.)
  • Work with the clipboard to cut/paste text items
  • Work with the registry

-- KevinJarnot - 20 Dec 2004

Being a 'playful parent'

From http://web.redding.com/specials/brainchild/primer/p_2.shtml

Children learn when they play. When a child drops food off his high chair, he learns about gravity. Swinging helps with balance; playing with other kids teaches sharing; peek-a-boo "teaches them that people might go away but they also come back." Parents help children expand their abilities when they just play with them.

Remember these tips:

  • Share floor time. Play games your child wants at his level.

  • Take snuggle breaks when your child begins to get frustrated to maintain a good connection.

  • When playing a competitive game, let your child win most of the time at first; it helps her build a sense of accomplishment. "Then gradually build up your effort so that she can get a sense of her own abilities."

  • Give your child undivided attention rather than keeping one eye on dinner or playing and working at the same time.

  • When your child giggles, go with it. Figure out what's making him giggle and do it over and over again.

  • Play dress-up, but let your child be the director. Let them assign you a role in their play and them ham it up.

  • Take time in the morning to play. Just 10 minutes of acting silly with your child will provide an outlet for some of her playtime energy and therefore save you from anxiously fussing and nagging at her to get ready.

  • Set aside time every week to play (enthusiastically) all the games you normally hate to play.

  • Be prepared for wildly fun and exuberant play to switch instantly to tears and tantrums. That happens sometimes because children feel so safe and so well loved that they let out all the feelings they've been holding in. Just listen to them until they're done and then get back to playing.

  • When two children fight over a toy, grab it and run, saying, "I never get to play with this toy! You two will never be able to get it away from me!" Then the two have to become a team and work together instead of taking it out on one another.

-- KevinJarnot - 09 Dec 2004

Beware of Wimpy SLAs

From http://thewhir.com/king/doug-kaye-051002.cfm

May 10, 2002 - By and large, the Web hosting industry has made great strides during its brief history. But when it comes to service level agreements-although there are a few exceptions-most Web hosting vendors have done a remarkably poor job. Most of the few SLAs that do exist don't come close to describing the levels of service that vendors say they can deliver and that they (verbally) lead their customers to expect.

But it's not only the vendors that are at fault. Web hosting customers are equally to blame for signing contracts that specify levels of service that are well below what they actually consider acceptable. Should a customer be satisfied if its Web site goes down for a full eight-hour business day nearly every month? Would that customer say, "My Web hosting service does just what I expected it to do?" If the relationship is based on a 99 percent uptime SLA, that's what the parties have agreed to. If a site goes down that often, the customer shouldn't be surprised when it turns out the vendor thinks everything is just fine. That customer will be on record for having said that's good enough. Which party is responsible for creating mismatched expectations? They both signed the same contract.

Yes, I'm on a personal campaign to improve the state-of-the-art of SLAs, and because both vendors and customers read The WHIR, I'd like all of you to consider how sorry that state is today. Why do SLAs so poorly represent the actual level of services vendors deliver to their customers, and what can we do to bring the services and SLAs more in line so that SLAs can become more useful tools?

Vendors say they actually deliver higher service levels than what they put into their SLAs, but that they've got to be conservative. Why is that? We don't do that in our other contracts and warranties. We put into writing exactly what will and won't happen in case something goes wrong.

If you buy a new car, you get something along the lines of a 36-month warranty. Everyone knows what that means. Once you're past the 36th month, you're on your own. There are no surprises and no mismatched expectations. No one expects a car manufacturer to repair a car for free beyond the warranty period, and no car salesperson would suggest that his or her company would do so. So why should we expect Web hosting vendors to deliver levels of service that are higher than what is in their SLAs? It seems to be something unique about the Web hosting industry - too much of it is built on unwritten expectations.

Many wimpy SLAs come from vendors that have jumped onto the bandwagon just so they can tell the world they have SLAs. You might be tempted to brush off wimpy SLAs as merely worthless. In fact, they can actually cause you more harm than if they didn't exist at all.

If you and your Web hosting vendor end up in arbitration or litigation, someone (an arbitrator, judge, or jury) will need a basis upon which to decide the level of services to which you're entitled. Lacking anything in writing, an arbitrator will probably use some vague criteria such as "industry standard practices" or "reasonable efforts," which may or may not be to your advantage.

But if there's something in writing such as a document entitled "Service Level Agreement" that purports to express the intentions of the parties, that document will most likely supercede other criteria. The whole purpose of an SLA, after all, is to clearly express the mutual expectations and commitments of the parties. If that SLA doesn't express your understanding of the service level expectations, it may be too late.

The advantage of an SLA in this situation is that it specifies the levels of service less ambiguously than if they were left unspecified. If an SLA exists, a judge, jury or arbitrator will likely use the service levels defined in the SLA instead of more generally accepted measurements. After all, these were the levels of service that the parties agreed to at the inception of their contractual relationship.

If your contract includes wimpy SLAs, you (not only the vendor) must be willing to live with them. When push comes to shove, and the vendor holds an SLA up in front of an arbitrator, it's too late for a customer to claim that it expected something more than was written into your agreement.

Customers shouldn't include (even by reference) an SLA in a Web hosting or managed services agreement unless it expresses the levels of service you'll accept. If you and your vendor can't agree on the wording of an SLA, it may be preferable not to have one at all. Better yet, find another vendor who will put better service levels in writing.

Make Web hosting vendors compete for your business-not with glossy brochures and verbal promises, but through specific, written commitments to deliver the services they claim they can provide. It's only in reaction to customer demand and the pressures of competition that SLAs will become the valuable documents they deserve to be.

-- KevinJarnot - 07 Jan 2005

Canon A620

  • 7.1 MP Digital Camera
  • 4x Optical Zoom
  • Dimensions - 4.1 x 2.6 x 1.9 in. (volume: 20.3 cu in.)
  • Rotating 2.0" LCD display (2.0" versus 1.8")
  • DIGIC II image processor
  • Improved movie, continuous shooting modes
  • SD/MMC card support
  • USB 2.0 High Speed support
  • Battery life - 500 shots (2300 mAh NIMH batteries)

Image sizes

Resolution Quality Approx. file size # images 32MB card # images 512MB card
Large
3072 x 2304
Superfine 3.0 MB 9 156
Fine 1.9 MB 15 251
Normal 902 KB 31 520
Middle 1
2592 x 1944
Superfine 2.4 MB 11 190
Fine 1.4 MB 20 339
Normal 695 KB 40 671
Middle 2
2048 x 1536
Superfine 1.6 MB 17 295
Fine 893 KB 32 529
Normal 445 KB 63 1041
Middle 3
1600 x 1200
Superfine 1002 KB 28 471
Fine 558 KB 51 839
Normal 278 KB 97 1590
Small
640 x 480
Superfine 249 KB 109 1777
Fine 150 KB 168 2747
Normal 84 KB 265 4317

Links

-- KevinJarnot - 30 May 2006

Catching 'gotchas' in tech contracts

One lawyer called IT deals 'a breeding ground for litigation'

from http://www.computerworld.com/managementtopics/management/story/0,10801,95323,00.html

News Story by Thomas Hoffman

AUGUST 18, 2004 (COMPUTERWORLD) - NEW YORK -- Most technology contracts crafted between vendors and user companies "are atrocious, poorly written and short on details," according to attorney Mark Grossman. In short, he said, "they're a breeding ground for litigation."

The breakdown in writing effective contracts is largely the fault of enterprise customers, said Grossman, chairman of the technology law group at Becker & Poliakoff P.A. in Coral Gables, Fla. That's because IT and contract managers at user companies often fail to apply critical negotiation techniques, such as ensuring that performance promises made by vendors during the request for proposals process are incorporated into any final agreements, said Grossman.

He presented several sessions on the legal aspects of technology contracts at the IBM Share user group conference held here yesterday.

Part of the problem is that a vendor's response to an RFP is usually driven by its sales force to help clinch a deal with a would-be customer. The performance and support promises offered during this stage are typically omitted from the final contract draft submitted by the vendor's more cautious legal staffers, Grossman said.

It's a common occurrence. "We do it all the time," said Earl Johnson, an application programming manager for the city of Dallas, referring to the city's failure to incorporate RFP responses into tech contracts. The main reason that happens, said Johnson, "is the need for expediency and to maintain good relations with the vendor." He noted that the city hasn't taken any steps to try to resolve this issue.

Enterprise customers are usually less prepared for software negotiations than vendors are, said William Snyder, an analyst at Stamford, Conn.-based Meta Group Inc. "If you're in negotiations with a software vendor, in 75% of the cases they know more about your company than you do," he said.

That's because a vendor's salespeople are trained to investigate prospective customers, including what other IT projects they might have in the pipeline and how a particular deal might fit in, said Snyder. By contrast, a software licensing manager is probably familiar with just one division of his company.

It doesn't help that most companies go into contract negotiations at an immediate disadvantage because the draft of the agreement is typically crafted by the vendor, unless it's a Fortune 100 company with considerable purchasing clout, said Grossman.

"We've taken a different approach," said an IT manager for a major auto manufacturer who requested anonymity. Last year, the company hired Gartner Inc. to create a master service agreement template that the company has begun using with a group of four offshore application development outsourcing vendors it plans to work with.

"Historically, our 15 application development managers each had the authority to negotiate such deals on their own," said the IT manager. The master service agreement approach, he said, "should give us more unanimity on contracts."

But the master service agreements aren't a silver bullet for the automaker. Since the offshore vendors returned the contract proposals with suggested changes five months ago, little progress has been made toward finalizing the agreements.

"The IT department is ready to go, but when we bring this to our contracts and legal team, they tell us it might take them a few weeks to get around to this," he said. "It's holding up the whole process."

-- KevinJarnot - 12 Jan 2005

Code Complete

Notes

Chapter 2

  • Fred Brooks' idea to plan to throw first away is not good idea
  • Incremental, or evolutionary approach is much better methodology. Start with basic functionality and build on it over time.
    • This is the basis of the Agile method
  • Another good metaphor is bldg construction

Chapter 3

  • Software development is more than coding
  • Some form of req is necessary for successful project
  • WISCA syndrome - Why Isn't Sam Coding Anything?

Edit drawing `pyramid` (requires a Java 1.1 enabled browser)

  • Architectural components
    • Program organization
    • Major classes
    • Data design
    • Business rules
    • User interface design
    • Resource management
    • Security
    • Performance
    • Scalability
    • Interoperability
    • I18N/L10N
    • Input/output
    • Error processing
    • Fault tolerance
    • Architectural feasibility
    • Overengineering
    • Build vs buy decisions
    • Reuse decisions
    • Change strategy

Chapter 5

  • Desirable characteristics of a design
    • Minimal complexity
    • Ease of maintenance
    • Loose coupling
    • Extensibility
    • Reusability
    • High fan-in
    • Low-to-medium fan-out
    • Portability
    • Leanness
    • Stratification
    • Standard techniques

-- KevinJarnot - 30 Jan 2005

Cameras

Canon Powershot SD400 5MP Digital Elph Camera with 3x Optical Zoom

Canon Powershot SD500 7.1MP Digital Elph Camera with 3x Optical Zoom

Canon Powershot SD550 7.4MP Digital Elph Camera with 3x Optical Zoom

Canon Powershot A620 7MP Digital Camera with 4x Optical Zoom

Photo Printers

HP PhotoSmart 8250

-- KevinJarnot - 02 Nov 2005

Cygwin

  • Primary site - http://www.cygwin.com
  • X for Cygwin - http://x.cygwin.com
  • Mortens Cygwin X-Launcher - http://www.hostalive.net/cxlaunch.html
    • a tool to configure and run the X-server of the Cygwin-project including to connect to a remote server via XDMCP or a shell...pre-sets (connection options) can be defined and saved to easily access remote (or local) X-server services. All information are stored in an INI-file allowing easy changes. Furthermore (in advanced mode) nearly all XWin settings can be experiment with. Finally Cygwin X-Launcher supports an extensive set of command-line parameters allowing several configurations and launch of pre-sets automatically.
  • PuTTY patch for Cygwin - http://gecko.gc.maricopa.edu/~medgar/puttycyg/

-- KevinJarnot - 04 Feb 2005

Lisa B.'s Guide to Standalone DVD Player Compatibility

If you are tired of burning an AVI to disc, only to find out that it doesn't play in your standalone DVD player, then this is the guide for you!

Although I wrote this guide with the Philips 642 in mind, I will talk about just about every AVI feature that could possibly affect standalone playback, so it should be useful for anyone with a standalone DVD player.

There are really only two tools that you need to diagnose your AVI's - MPEG4Modifier and GSpot. The latest versions of these can always be downloaded at the great general-purpose video site, www.videohelp.com, in the Tools section. Make sure to download the latest Beta of GSpot, since it contains many features not in the latest stable version. You may also want to download VirtualDubMod? from the same site.

Diagnosing your AVI with MPEG4Modifier

After launching MPEG4Modifier, simply click the browse button, then select and open your AVI.

A. Aspect Ratio

This should be "Square Pixels". If it is anything other than "Square Pixels", the Philips 642 will not play it. For other players, you may want to make a small test sample, burn to CDRW, and see what happens.

To change the Aspect Ratio to "Square Pixels", just click the radio button for "Square Pixels", click the "Save..." button, and you will be prompted for a new AVI name....it will take a few minutes as it saves the new, modified, AVI.

Keep in mind that MPEG4Modifier is not an encoder. When you save out a new avi, it is just changing header and/or packaging information, so there will be no loss of video quality.

B. Packed Bitstream

The Philips 642 has no problem with packed bitstream, so if you have a Philips 642, don't touch this option. Some other standalones have problems with packed bitstream...the problem has been described as a "stuttering" of the video. Keep in mind, though, there are other possible causes of "stuttering", so you'll want to eliminate the other possible causes first.

You should not unpack the bitstream unless you need to. Packed bitstream can help maintain audio synch after editing or remuxing, for example.

To unpack the bitsteam, just click the radio button for "Unpack", click the "Save..." button, and you will be prompted for a new AVI name....it will take a few minutes as it saves the new, modified, AVI.

C. User Data

This is not very important, but it can tell you what version of DivX? or XviD? was used to encode the AVI. You may also tell if someone has mistakenly changed the 4CC code of the file.

D. Interlacing

The Philips 642 has no problem with a properly interlaced AVI. That being said, I have yet to come across a properly interlaced AVI in all my roaming around the internet. By "properly interlaced", I mean that the original material was truly interlaced (not just telecined), and that the interlace was properly maintained from source to final encoded AVI.

Here is what happens when you take a progressive source and encode it as interlaced:

1. In the Philips 642, if the frame rate is not 29.97, then there will be a very jerky playback. If the framerate is 29.97, then the interlace has no effect.

2. In other standalones, interlaced avi's may not play at all, or they may look fine. This you'll need to test using the provided support files.

MPEG4Modifer cannot "uninterlace" an avi. If you are dealing with a jerky playing interlaced AVI (and this is not due to wrong field order), then you will need to re-encode it.

The other thing that can go wrong with an interlaced AVI is that the field order can be wrong. If the field order is wrong, you will have a very odd jerky movement which I can't quite describe, so refer to the support files.

If you need to change the field order, just click the radio button that is not currently selected (either "Top First" or "Bottom First"), click the "Save..." button, and you will be prompted for a new AVI name....it will take a few minutes as it saves the new, modified, AVI.

E. Video Info

This button supplies some additional important info. Click it, and look for the following features:

1. QPel - The Philips 642 will not play Qpel. Some standalones will. You may want to make a small test sample and see what happens.

QPel cannot be removed from an AVI. If your player doesn't play QPel, then you will have to re-encode the AVI.

2. GMC - in parenthesis, you will see how many "warp points" were possible. GMC is associated with S-VOPs. At the bottom of the window, there will be a statistical breakdown of how many warp points were actually used in the S-VOPs. The important thing to note is the following: if it uses only 1 warp point 100% of the time, then the AVI will play without problems in the Philips 642. If, on the other hand, some S-VOPs use more than one warp point, then the AVI will quit playing as soon as it hits a "multi-warp-point" S-VOP.

GMC cannot be removed from an AVI, nor can the number of warp points be modified. If your player doesn't play GMC, then you will have to re- encode the AVI.

3. Quant type - The Philips 642 will play "H.263" or "MPEG" quantization type. The Philips 642 has problems playing "Custom MPEG" quantization type, but there is a workaround.

When the Philips 642 tries to play an AVI using "Custom MPEG" quantization, then you will typically see all these pixellated, blocky, psychedelic colorings. This can be fixed by pressing the "System Menu" button (on the remote control) twice.

The "System Menu" fix is a cheap fix, and you will still notice some funky color smearing throughout the film. This is mild enough that it is acceptable to many people. To get the best results, though, all AVI's with "Custom MPEG" should be re-encoded for proper playback on the Philips 642.

There is also a minor incompatibility between the Philips 642 and the "MPEG" quantization type, which is noticeable in certain kinds of scenes. This is why I do all my own encodes using H.263. See the support files for more details.

4. N-VOPs - This is the rather interesting thing I discovered, that, to my knowledge, no one else has discovered. The Philips 642 seems not to recognize N-VOPs...in other words, it just skips right over them. This leads to audio synch problems. The audio can be brought back in synch by fast forwarding or rewinding a few frames, but then it will go back out of synch the next time it encounters more N-VOPs.

Look at the number of N-VOPs. Keep in mind that everytime the player hits an NVOP, the audio will get out of synch...if your avi has more than 1 or 2 N-VOP's, you'll probably want to re-encode the AVI if you want it to play back in synch on the Philips 642.

If you have a different player, it may play N-VOP's just fine, so test it out with the file that I supply in the support files.

Don't use GSpot to figure out if you file has N-VOP's...GSpot will say that all packed bitstream AVI's have N-VOP's whether they do or not!

Diagnosing your AVI with GSpot

MPEG4Modifier is great, but the one thing it doesn't tell you about is how your AVI is interleaved. Interleaving tells you how the audio is mixed with the video. This isn't important for playback from a hard drive, but it is important when you are playing it off of a CD or DVD. GSpot will tell you how your AVI is interleaved.

A. Audio

Look in the "Codec" field and see whether your AVI has MP3 or AC3 audio. If the audio is something else, then you will have to re-encode the audio if you want to play the AVI on the Philips 642. Re-encoding audio is easy, but is beyond the scope of this guide.

B. Container

The container should be either "AVI v1.0" or "OpenDML (AVI v2.0)". If it is anything else, then you should re-mux the avi.

There should be a line labeled "Interleave:". If there is not, then your audio is not interleaved with your video and you need to re-mux the avi.

"preload" should be around 500. If it is 300-600, then great. If it is not, then you should re-mux the avi.

The other part of the interleave parameters depends on what kind of audio you have.

1. MP3 Audio

For MP3 Audio, it should be set to "1 vid frame"

2. AC3 Audio

For AC3 Audio, it could be set to "1 vid frame", but this is not preferred, and may or may not lead to "stuttering" at various points in the film.

For AC3 Audio, it should be set to "64 ms"

Re-muxing your AVI with VirtualDubMod?

1. Open AVI in VirtualDubMod?. 2. If you get some kind of warning about VBR header, and it asks the question "Do you want to rewrite the header?", then say "No". 3. Select "Video - Direct Stream Copy" (i.e., direct stream copy in the "Video" menu) 4. For AC3 audio, select "Streams - Stream List"...Right-Click on the AC3 audio stream...Select "Interleaving..." from the pop-up menu...choose to interleave audio every 64 ms (remember to click the "ms" radio button). Then exit out of the dialog and the stream list (i.e., hit "OK" twice). 5. Select "File - Save As..." 6. Specify a new file name, and click OK.

Making a test sample of your AVI with VirtualDubMod?

There's no need to burn the whole AVI just to test it out in your standalone -- make a sample! Keep in mind though, that the sample is "re-muxed", so just because it plays perfect in your standalone doesn't mean that you don't need to check the interleaving of the original AVI with GSpot!

1. Open AVI in VirtualDubMod?. 2. If you get some kind of warning about VBR header, and it asks the question "Do you want to rewrite the header?", then say "No". 3. Select "Video - Direct Stream Copy" (i.e., direct stream copy in the "Video" menu) 4. Select "Video - Select Range"...in the "Frames" column, set the length to 3000, then exit out of the dialog (i.e., hit "OK"). 5. Select "File - Save As..." 6. Specify a new file name, and click OK.

Re-encoding your AVI

This isn't difficult, but is beyond the scope of this guide. One day I'll write a re-encoding guide!

Support Files

I have a variety of little avi clips that will let you test your standalone, and see examples of various AVI problems and incompatibilities. Information is in a separate read-me file.

Tips

1. If you have more than 1 physical hard drive in your computer, then when you modify an avi, or re-mux an avi, you should choose a destination folder which is not on the same physical hard drive as the source. This will make the process a lot faster.

2. Unless you do a lot of encoding, you probably want to go into the VDubMod?'s preferences and set "Direct Stream Copy" as the default video processing mode...that way you won't have to set that option every time.

About the Guide

A lot of this I learned from an awful lot of trial and error. I hope you guys find this to be useful information!

Lisa B.

-- KevinJarnot - 21 Jun 2005

Dell Axim Stuff

Built-in Storage Disappears

From https://spritesoftware.crmdesk.com/answer.aspx?id=194&back=browse.aspx%23p15:

This appears to be caused by an issue on the Dell Axim itself, and can happen whenever file access is carried out that involves the "Built-in storage".

Steps to reactivate the "Built-in Storage" on a Dell Axim


  1. Hold the power button, then use the stylus to press the soft-reset button.
  2. When you are prompted whether you wish to clear all memory, select the Mail button (envelope) to 'Cancel'. DO NOT select to proceed, as all data on the device will be deleted.
  3. Once the device turns back on, the "Built-in Storage" will be available.

-- KevinJarnot - 04 May 2006

Disaster Recovery Planning

-- KevinJarnot - 07 Mar 2006

Effective Note Taking

(from http://www.sjr.mb.ca/kayeca/Notetake.htm)

1. NOTETAKING IS A SKILL

  • This takes understanding of what you're doing
  • It takes practice, which involves effort

2. NOTETAKING IS DIFFICULT BECAUSE:

  • Spoken language is more diffuse than written
  • Speaker's organization is not immediately apparent
  • Spoken language is quickly gone o This makes analysis difficult

3. FOUR PURPOSES FOR NOTETAKING:

  • Provides a written record for review
  • Forces the listener to pay attention
  • Requires organization, which involves active effort on the part of the listener
  • Listener must condense and rephrase, which aids understanding

4. PHYSICAL FACTORS

  • Seating
    • Near the front and center
      • Vision and hearing are better
      • Avoid distractions
        • Doorways, window glare, etc.
        • Peers
  • Materials
      • Two pens
      • Wide-lined, easy-eye paper
      • Date and topic written on paper
      • Plenty of blank paper in back

5. BEFORE TAKING NOTES

  • Prepare yourself mentally
    • Be sure of your purpose and the speaker's purpose
  • Review your notes and other background material if available
  • Generate enthusiasm and interest
    • Increased knowledge results in increased interest
    • A clear sense of purpose on your part will make the speaker's content more relevant
  • Be ready to understand and remember
  • Anticipate what is to come, and evaluate how well you were able to do this

6. DECIDE HOW MUCH YOU ARE GOING TO DO

  • Are notes necessary?
    • Don't be lulled into a sense of security by an effective presentation
  • Hearing a thing once is not enough. Memory requires:
    • Review
    • Reflective study

7. PRACTICE TLQR TECHNIQUE

  • Tune-in
    • Listening takes energy
  • Look at the speaker
    • Mannerisms will give extra clues
    • Looking helps focus attention
  • Question
    • Nothing will generate interest so much as an appropriate question
  • Listen
    • Be selective. Some things are more important than others.
    • Be alert for speaker emphasis through:
      • Tone or gesture
      • Repetition
      • Use of cue words such as: remember, most important, etc.
      • Illustration on board
      • Reference to text
        • Note especially new words and ideas
  • Note especially those ideas which conflict with your own picture of the world
    • "Odd" ideas are difficult to understand initially and require extra effort
    • You remember things which support your existing concepts, and forget those things which disagree
  • Review
    • Glance back over material from time to time to see if a pattern is emerging, if consistency is being maintained, etc.
    • If possible, clarify points during or after the lecture

8. WHILE TAKING NOTES

  • Don't try for a verbatim transcript
    • Get all of the main ideas
    • Record some details, illustrations, implications, etc.
  • Paraphrase
    • But remember that the speaker may serve as a model
  • Integrate with other knowledge you already have
    • But don't allow preconceived notions to distort what you are hearing
  • Use form to indicate relative importance of items
    • Underscore or star major points
  • Leave plenty of white space for later additions
  • Note speaker's organization of material
    • Organization aids memory
    • Organization indicates gaps when they occur
  • Be accurate
    • Listen carefully to what is being said
    • Pay attention to qualifying words like: sometimes, usually, rarely, etc.
    • Notice signals that a change of direction is coming: but, however, on the other hand
  • Be an aggressive, not a passive, listener
    • Ask questions and discuss if it's permitted
    • If not, jot questions in your notes
    • Seek out meanings. Look for implications beyond what is being said
    • Relate the material to your other classes and your life outside of school
  • Develop a suitable system of mechanics
    • Jot down words or phrases, not entire sentences
    • Develop some system of shorthand and be consistent in its use
    • Hr s sntnc wth vwls lft t
    • Leave out small service words
    • Use contractions and abbreviations
    • Use symbols: +, =, &, @
  • Try to get the hang of listening and writing at the same time. It can be done.
    • You may practice listening to the news on TV and taking notes

9. AFTER TAKING NOTES

  • Review and reword them as soon as possible
    • Don't just recopy or type without thought
    • "Reminiscencing" may provide forgotten material later
    • Rewrite incomplete or skimpy parts in greater detail
    • Fill in gaps as you remember points heard but not recorded
    • Arrange with another student to compare notes
  • Use your notes as a learning tool
    • Review at spaced intervals
      • Spaced effort is more effective than the same effort spent cramming
      • We forget 50% of what we hear immediately; two months later, another 25% is gone. But relearning is rapid if regular review is used
      • Compare the information in your notes with your own experience
      • Don't swallow everything uncritically
      • Don't reject what seems strange or incorrect. Check it out.
      • Be willing to hold some seeming inconsistencies in your mind over a period of time
      • Make meaningful associations
      • Memorize that which must be memorized
  • Sharpen your notetaking technique by looking at other students' notes. How are they better than your own? How are your notes superior?
  • Practice those skills you wish to develop

Adapted from: http://www.dartmouth.edu/admin/acskills/notetaking.html April 1997 SJR

-- KevinJarnot - 17 Nov 2004

Eight Golden Rules of Interface Design

Shneiderman's "Eight Golden Rules of Interface Design"

These rules were obtained from the text Designing the User Interface by Ben Shneiderman. Shneiderman proposed this collection of principles that are derived heuristically from experience and applicable in most interactive systems after being properly refined, extended, and interpreted.

To improve the usability of an application it is important to have a well designed interface. Shneiderman's "Eight Golden Rules of Interface Design" are a guide to good interaction design.

1 Strive for consistency.

Consistent sequences of actions should be required in similar situations; identical terminology should be used in prompts, menus, and help screens; and consistent commands should be employed throughout.

2 Enable frequent users to use shortcuts.

As the frequency of use increases, so do the user's desires to reduce the number of interactions and to increase the pace of interaction. Abbreviations, function keys, hidden commands, and macro facilities are very helpful to an expert user.

3 Offer informative feedback.

For every operator action, there should be some system feedback. For frequent and minor actions, the response can be modest, while for infrequent and major actions, the response should be more substantial.

4 Design dialog to yield closure.

Sequences of actions should be organized into groups with a beginning, middle, and end. The informative feedback at the completion of a group of actions gives the operators the satisfaction of accomplishment, a sense of relief, the signal to drop contingency plans and options from their minds, and an indication that the way is clear to prepare for the next group of actions.

5 Offer simple error handling.

As much as possible, design the system so the user cannot make a serious error. If an error is made, the system should be able to detect the error and offer simple, comprehensible mechanisms for handling the error.

6 Permit easy reversal of actions.

This feature relieves anxiety, since the user knows that errors can be undone; it thus encourages exploration of unfamiliar options. The units of reversibility may be a single action, a data entry, or a complete group of actions.

7 Support internal locus of control.

Experienced operators strongly desire the sense that they are in charge of the system and that the system responds to their actions. Design the system to make users the initiators of actions rather than the responders.

8 Reduce short-term memory load.

The limitation of human information processing in short-term memory requires that displays be kept simple, multiple page displays be consolidated, window-motion frequency be reduced, and sufficient training time be allotted for codes, mnemonics, and sequences of actions.

-- KevinJarnot - 18 Jan 2005

Fathering Articles

Favorite Authors

Ted Chiang

  • Campbell New Writer Award (1992)
  • Nebula Award for "Tower of Babylon" (1990)
  • Nebula and the Theodore Sturgeon Memorial Award for "Story of Your Life" (1998)
  • Sidewise Award for "Seventy-Two Letters" (2000)
  • Locus Award for "Hell Is the Absence of God" (2001)
  • Hugo Award for "Hell Is the Absence of God" (2002)
  • Stories of Your life and Others
  • A Conversation with Ted Chiang - SF Site, Jul 2002
  • Ted Chiang Interview - Fantastic Metropolis, Dec 2003

China Mieville

Christopher Moore

Terry Pratchett

Neal Stephenson

John Varley

-- KevinJarnot - 08 Feb 2005

Firefox

General

"Secrets"

About:

  • about: - info on Firefox's version number, copyright, etc.;
  • about:config - configuration console
  • about:cache - displays a summary of both your memory and file cache, with a link to full file listings
  • about:buildconfig - lists the compiler options that were used to create your version of Firefox
  • about:plugins - enumerates your installed add-ons
  • about:credits - displays the names of developers and testers who worked on the product

Configuration and Optimization

Links

Fix memory leak in Firefox 1.0

Firefox is supposed to dynamically release memory from its RAM cache to other Windows applications as needed. Unfortunately, Firefox 1.0 seems to consume more memory than it should, which hurts performance, when set to the default of 51200 KB (51 MB).

To solve this, Firefox power users recommend limiting the memory cache using the Configuration Console. This frees up memory for other apps, speeding up everything to a greater or a lesser extent, depending on your machine and the applications you run. Here's how the trick works:

1. Type about:config into Firefox's Address Bar and press Enter. 2. Right-click any row, then click New, Integer. Type or paste the following preference name into the dialog box that appears (this is a hidden preference that doesn't exist in the Configuration Console until you create it):

browser.cache.memory.capacity

3. Click OK, then enter the following integer number into the next dialog box, representing 16 MB of RAM for the cache:

16000

4. Click OK to close the dialog box, then close all instances of Firefox and restart it.

For a lengthy discussion of this option, see Mozillazine's forum topic 172041.

Extensions

General Sites

Must Haves

IEView

miniT

  • Adds a few tab related functions.
    • docShell.allow* attributes can be changed via tab context menu
    • Tabs can be switched by turning the mousewheel on the tab bar
    • Browser is refocused on UI middle click
    • New tabs can be opened by double clicking on any tab
    • Tabs can be dragged. If dropped within the tab bar the tabs will be reordered, otherwise the URL is dropped as text/x-moz-url, text/html, or text/unicode
  • http://extensionroom.mozdev.org/more-info/minit

Sitebar (via Online Bookmarks)

Weblinks

Resize Search Box

Tabbrowser Preferences

  • Comprehensive UI for changing a number of the hidden tabbed browsing preferences in Firefox. It also provides the ability to control how internal and external links are opened in the browser and how the browser will react when links are sent to it.
  • http://www.pryan.org/mozilla/site/TheOneKEA/tabprefs/

Tiny URL Creator

  • It will convert a long URL into a smaller, more managable one which is easier to share through email and instant messanger. When you access the new "tiny" URL in your browser it will autmatically send you to the original one. This extension uses the extremely popular and useful site, TinyUrl.com, to generate URLs.
  • http://jgillick.nettripper.com/tinyurl/

BugMeNot

AdBlock

  • A content filtering plug-in for the Mozilla and Firebird browsers. It is both more robust and more precise than the built-in image blocker. Adblock allows the user to specify filters, which remove unwanted content based on the source-address. If this sounds complicated, don't worry: it's not. Just add a few filters. Every time a webpage loads, Adblock will intercept and disable the elements matching your filters. See?- nothing to it.
  • http://adblock.mozdev.org/
  • Adblock filters:

Hit-a-Hint

  • Hit-a-Hint provides a way to click elements on the page without a mouse. User can press '<' button to activate typing mode, and then numbered hints will appear on every link. Typing the number inside the hint over a link and then pressing <enter> will 'click' the link. Read more on the extension's homepage.
  • http://www.hut.fi/~psillanp/hah_hp/

Troubleshooting

MPEG movies are displayed via Quicktime plug-in

  • Make sure Quicktime is not default player for MPEG movies
    • In Quicktime player:
      • Edit -> Preferences -> Quicktime Preferences
      • File Type Extensions -> File Types
      • Unselect everything under MPEG branch
  • Make sure browser plug-in is not default player for MPEG MIME type
    • In Quicktime player:
      • Edit -> Preferences -> Quicktime Preferences
      • Browser Plug-in -> MIME Settings
      • Unselect everything under MPEG branch

-- KevinJarnot - 04 Dec 2004

Full Body Exercises

Static Hold Leg Extensions

Start with static hold (plank) position. Lift one leg, and move leg as far as possible to side. Hold, then return. Alternate legs, 8x each for 3 sets.

Butt Blasters

Lay on back with legs bent, feet roughly 1 foot from butt. Raise hips, lift one leg, and keeping leg straight, push it outwards from heel. Do 8x each leg for 3 sets.

YTIs

Plank across a Swiss Ball, legs on ground, with lower chest on ball. Hold 2 barbells (I started with 5 lb, now up to 10-15), palms upward, arms extended 10 degrees from body and barbells raised as high as possible ("Y"). Hold for 3 seconds. Next, move barbells to 90 degrees from body, as high as possible, palms down ("T"). Hold for 3 seconds. Next, move barbells to sides, palms up ("I"). Hold for 3 seconds. Repeat 8x for 3 sets.

Power Lunges with Curls

Stand straight, with barbell in each hand (20 lb?). Raise one leg at the knee to 90 degrees, and lunge, landing with leg extended and bent at knee, other leg back with knee just behind the other foot. The knee should not touch the ground. Hold for 3 seconds. Move back to standing position, with leg that was extended up at 90 degrees to body (knee bent). Slowly perform 2-3 curls with barbells while holding leg up. Repeat sequence 12x for 3 sets.

Swiss Ball Arm Extensions

Plank across barbell (as in YTIs) holding 2 light barbells extended, arms raised as high as possible with palms down. Alternate bringing barbells back behind ear, at least 4x each. Then do both arms together, at least 4x. 3 sets.

One Leg Barbell Toe Touches

Stand straight, holding 2 20 lb barbells at sides. Raise one leg slightly, bent at knee, with foot 6" from ground. Bending slightly, slowly touch the opposite barbell to the toe of the raised foot. Slowly move back to standing position, keeping foot raised the entire time. Alternate sides, 12x each side, 3 sets.

Swiss Ball Presses

Lay with back on Swiss ball, feet on ground, knees bent at 90 degrees. Hold 25 lb barbell in each hand, arms extended upwards like you're read to do a bench press. Slowly bring one arm down, elbow to side of ball. Raise arm, and alternate with other arm. Do 12x each arm, then 12x together.

Pushups with side thingy

-- KevinJarnot - 08 Feb 2006

GPS Comparisons

Garmin GPSMap 60CS 56 MB GPS with Color Display, Digital Compass, and Altimeter

Product Description

The Garmin GPSMAP 60CS is full of features that are only found on the newest generation GPS handheld units. It's not enough to only have color displays anymore. Garmin knows this and they upped the ante on this lightweight, rugged, waterproof unit, offering a 256-color, highly reflective display that provides easy viewing in almost any lighting condition, including sunlit conditions. This transreflective TFT, 2.6" diagonal screen provides excellent viewing while maximizing your battery life (up to twenty hours with typical use) but not up to the massive thirty hours that the Garmin GPSMAP 60C offers. However, the GPSMAP 60C falls behind in the feature race as the GPSMAP 60CS comes equipped with a very handy compass, altimeter, glide ratio and vertical speed to destination calculators.

The GPSMAP 60CS offers an electronic compass and barometric altimeter for highland adventures. These sensors, when combined with GPS technology, provide enhanced bearing and elevation readings. Barometric sensor with automatic pressure trend recording. With the elevation computer, you can find current elevation, ascent/descent rate, minimum and maximum elevation, total ascent and descent, average and maximum ascent and descent rate. The trip computer provides odometer, stopped time, moving average, overall average, total time, max speed, and more.

The WAAS GPS receiver has an accuracy of ten feet in North America. With the fifty reversible routes, 10,000 track points and 1000 waypoints, you're sure to have enough tools to find your way. With the faster processor, the GPS unit provides quick auto routing, turn-by-run directions and audio alerts when using optional MapSource? software. There are 56 MB of internal memory for storing additional map detail. Downloading information is quick using the USB or serial port interfaces. Using the dedicated serial port, navigation instructions can be shared with repeaters, plotters and autopilots. The four position rocker pad and dedicated high-use buttons make navigating through the unit's features easy, even when your fingers are cold or wet.

Finally, the GPSMAP 60CS is packed with some extra fun features. An integrated outdoor calendar provides ideal hunting and fishing times, plus moon rise/set/location information. There is a dedicated geocaching mode for those of you into the hot, GPS community treasure hunt game. Finally, there are indoor/outdoor GPS games to help you and your friends enjoy the outdoors.

Garmin makes some accessories to help you integrate your GPS with your life and your priorities. Keep your GPS at the ready while protecting it from knocks and bumps is with a carrying case. If you'll be on the road, Garmin's U.S. topographical MapSource? CD-ROM provides the most detailed maps available. Or, for a combination of detailed U.S. maps and a car kit for mounting and powering your GPS, there's an automotive accessory pack for North America.

The WAAS difference

  • 100 meters: Accuracy of the original GPS system, which was subject to accuracy degradation under the government-imposed Selective availability (SA) program.
  • 15 meters: Typical GPS position accuracy without SA.
  • 3-5 meters: Typical differential GPS (DGPS) position accuracy.
  • Less than 3 meters: Typical WAAS position accuracy.

WAAS is a system of satellites and ground stations that provide GPS signal corrections, giving you even better position accuracy. How much better? Try an average of up to five times better. A WAAS-capable receiver can give you a position accuracy of better than three meters 95 percent of the time. And you don't have to purchase additional receiving equipment or pay service fees to utilize WAAS.

How it Works WAAS consists of approximately 25 ground reference stations positioned across the United States that monitor GPS satellite data. Two master stations, located on either coast, collect data from the reference stations and create a GPS correction message. This correction accounts for GPS satellite orbit and clock drift plus signal delays caused by the atmosphere and ionosphere. The corrected differential message is then broadcast through one of two geostationary satellites, or satellites with a fixed position over the equator. The information is compatible with the basic GPS signal structure, which means any WAAS-enabled GPS receiver can read the signal.

Who benefits from WAAS? Currently, WAAS satellite coverage is only available in North America. There are no ground reference stations in South America, so even though GPS users there can receive WAAS, the signal has not been corrected and thus would not improve the accuracy of their unit. For some users in the U.S., the position of the satellites over the equator makes it difficult to receive the signals when trees or mountains obstruct the view of the horizon. WAAS signal reception is ideal for open land and marine applications. WAAS provides extended coverage both inland and offshore compared to the land-based DGPS (differential GPS) system. Another benefit of WAAS is that it does not require additional receiving equipment, while DGPS does.

What's in the Box GPSMAP 60CS, PC/USB cable, lanyard, belt clip, manual and a one year warranty.

Product Description Garmin's new all-purpose PGS units are packed with exciting features and deliver the kind of color that consumers want in their handheld GPS's. These lightweight, rugged, waterproof units raise the bar to offer a 256-color, highly reflective display that provides easy viewing in almost any lighting condition. This transreflective TFT technology provides excellent viewing while maximizing your battery life (30 hours, typical use). Garmin's new powerhouse comes packed with extra features, including rapid automatic route calculation, an integrated outdoor calendar, a dedicated geocaching mode, and indoor/outdoor GPS games that turn the outdoors into a giant gameboard.The GPSMAP 60CS also offers an electronic compass and barometric altimeter for highland adventures. These sensors, when combined with GPS technology, provide enhanced bearing and elevation readings.

Technical data

  • Receiver: WAAS-enabled, 12 parallel channels, uses 12 satellites
  • Waypoints: 1000 with name and graphic, 10 nearest (auto), 10 proximity
  • Routes: 50 reversible with up to 250 points each, plus MOB and TracBack?
  • Tracks: 10,000-point automatic log, 20 saved tracks (500 points each)
  • Trip computer: Current speed, average speed, resettable max speed, trip timer, trip distance
  • Alarm clock: Anchor drag, approach and arrival, off-course, proximity waypoint, shallow and deep water
  • Tables: Celestial hunting and fishing tables, sun and moon rise, set and location
  • Map datums: 100+
  • Position format: Lat/lon, UTM/UPS, Maidenhead, MGRS, Loran TDs, user grid
  • Acquisition times: 15 seconds (warm), 45 seconds (cold), 5 minutes (autolocate)
  • Update rate: 1/second, continuous
  • GPS accuracy: Less than 15 meters (position), 0.05 m/s steady state (velocity)
  • DGPS (USCG) accuracy: 3-5 meters (position), 0.05 m/s steady state (velocity)
  • DGPS (WAAS) accuracy: Less than 3 meters (position), 0.05 m/s steady state (velocity)
  • Dynamics: 6 G's
  • Interface: USB, RS232 with NMEA 0183, RTCM 104 DGPS data format and proprietary Garmin
  • Antenna: Built-in quadrifilar, external antenna connection (MCX)
  • Differntial: DGPS, USCG and WAAS
  • Uploadable maps: Up to 56 MB of downloaded map detail
  • Compass accuracy: +/- 2 degrees (typical), +/- 5 degrees (extreme northern and southern latitudes)
  • Barometric altimeter accuracy: 10 feet (user and/or automatic calibration)
  • Altimeter range: -2,000 to 30,000 feet
  • Elevation computer: Current, resettable min and max, ascent/descent rate, total ascent/descent, average and max ascent/descent rats
  • Pressure: Local, 12-hour automatic trend recording
  • Power source: 2 AA batteries
  • Battery life: 20 hours
  • Dimensions: 2.4" x 6.1" x 1.3"
  • Display: 1.5" x 2.2", color TFT
  • Weight: 5.4 oz.
  • Case: Waterproof to IPX-7 standards
  • Temperature range: 5F to 158F
  • In the box: GPSMAP 60CS, PC/USB cable, lanyard, belt clip, manual and a one year warranty.

-- KevinJarnot - 30 Mar 2005

GPS Software

  • G7ToWin
    • G7ToWin is designed to transfer data between Garmin, Magellan, or Lowrance/Eagle GPS units and a PC.
    • G7ToWin supports download (transfer from the GPS to the PC) of waypoints, track logs, routes, events (Lowrance/Eagle units only), and for those units which support it, downloading a copy of the current display as a Windows bitmap.
    • G7ToWin supports upload (transfer from the PC to the GPS) all of the above except for the display, display bitmaps cannot be sent to the GPS.
    • Waypoints, routes, events, and track logs can be edited by G7ToWin and stored to various file types. Downloaded display bitmaps cannot be edited, however, they can be rotated. Display bitmaps may also be saved in a standard Windows .bmp file.
    • g7tosource.zip: G7To Source Code
  • EasyGPS - EasyGPS is the fast and easy way to create, edit, and transfer waypoints and routes between your computer and your GPS

-- KevinJarnot - 21 Apr 2005

''Getting Things Done'' by David Allen

  1. capture all the things that need to get done into a logical and trusted system outside of your head and off your mind
  2. disciplining yourself to make decisions about all the inputs you let into your life, so that you will always have a plan for next actions that you can implement or renegotiate at any moment

Outcomes & Actions

  1. describe in a single sentence the intended successful outcome for the problem or situation
  2. write down the very next physical action required to move the situation forward

Horizontal & Vertical Control (Get Things Off Your Mind and Get Them Done)

  1. horizontal maintains coherence across all activities in which you are involved
  2. vertical manages thinking up and down the track of individual topics and projects

Five Stages of Workflow (Horizontal)

  1. collect things that command our attention (anything personal or professional, big or little, that you think should be different than it currently is and that you have any level of internal commitment to changing)
    1. get it all out of your head
    2. minimize your collection buckets
      • physical in-basket
      • writing paper and pads
      • electronic note taking
      • auditory capture (answering machines, voicemail, dictating equipment)
      • email
    3. empty the buckets regularly
  2. process what they mean and what to do about them
    1. what is it?
    2. is it actionable? YES or NO
      • No
        1. trash
        2. incubate
          1. someday/maybe list
          2. tickler file (suspended or follow-on file; a 3D calendar)
            • 43 folders:
              • 31 Daily Files
              • 12 Monthly Files
              • Tomorrow's Date at the front
        3. reference (reference should be information that can be easily referred to when needed)
      • Yes
        1. What is the next action?
          • do it
          • delegate it
          • defer it
          • Project (anything requiring more than one step to accomplish the desired outcome)
        2. actionable tracking
          1. list of projects
          2. storage or files for project plans and materials
          3. calendar (time specific actions [appointments], day specific actions, day specific information)
          4. list of reminders of next actions
          5. a list of reminders of things you're waiting for (only review as often as they have to be in order to stop wondering about them)
  3. organize the results
  4. review the options
  5. do
    • choosing actions in the moment
      1. context
      2. time available
      3. energy available
      4. priority

Weekly Review

  1. Loose Papers
    • business cards, receipts, etc. - put in in basket for processing
  2. Process Your Notes
  3. Previous Calendar Data
    • review for remainning action items, reference information, etc.
  4. Upcoming Calendar
  5. Empty Your Head
    • write down any new projects, action items, etc.
  6. Review "Projects" (and Larger Outcome) Lists
    • ensure that at least one kick-start action is in your system for each
  7. Review "Next Actions" Lists
    • Mark off completed actions & review for reminders of further action steps to capture
  8. Review "Waiting For" List
    • Records appropriate actions for any needed follow-up & check off received items
  9. Review Any Relevant Checklists
  10. Review "Someday/Maybe" List
    • Check for any projects that may have become active and transfer them to "Projects" & delete items no longer of interest
  11. Review "Pending" and Support Files
    • Browse through all work-in-progress support material to trigger new actions, completions, and waiting-fors

Models for Making Action Choices

  1. predefined
  2. work as it shows up
  3. defining work

Six Level Model for Reviewing Your Own Work

  1. current actions
  2. current projects
  3. areas of responsibility
  4. 1-2 year goals
  5. 3-5 year vision
  6. big picture view

  • projects: clearly defined outcomes and the next actions to move them towards closure
  • horizontal focus: reminders placed in a trusted system that is reviewed regularly
  • vertical focus: informal back of the envelope planning

Five Steps to Accomplish Any Task (Project Planning)

  1. defining purpose and principles
  2. outcome visioning
  3. brainstorming
  4. organizing
  5. identifying next actions

Five Phases of Natural Planning Techniques

  1. purpose / guiding principles
  2. mission / vision / goals / sucessful outcome (what would success look, sound, or feel like?)
  3. brainstorming (how?)
    1. view the project from beyond the completion date
    2. envision wild success (suspend "Yeah, but. . .")
    3. capture features, aspects, and qualities you imagine in place
  4. organizing (identify components, subcomponents, sequences, events, and/or priorities; what must occur and in what order?)
  5. next actions
"If the project is off your mind, your planning is sufficient. If it's still on your mind, keep applying the model until it's clear."

Critical Factor of Filing System

  • filing has to be instantenous and easy
    • One Alpha System
      • consider A-Z organizing unless you need more specific filing
      • reduces number of place something ''isn't''
      • organize by topic, project, person, or company
    • specialized filing may be necessary if amount of reference material on one topic or project exceeds one file drawer.
  • get high quality mechanics and avoid hanging files
  • if you must use hanging files:
    • label files, not the hangers
    • use only one file folder per hanger
    • keep a big supply of plain hangers and new file folder in the front of the drawer
  • purge files once a year
  • encourage a dumpster day at work

Dealing with un-met agreements:

  1. lower standards
  2. do it
  3. renegotiate agreement

"What is the next action?"

"The better you get, the better you'd better get."

SUMMARY

  1. keep everything out of your head
  2. decide actions and outcomes when things first emerge on your radar, instead of later
  3. regularly review and update the complete inventory of open loops of your life and work


Pick up anything around you that youre wondering what to do with, and apply a simple set of formulae:

  • I dont need or want it = trash
  • I still need to decide what this means to me = IN basket item
  • I might need to know this information = reference
  • I use it = equipment and supplies
  • I like to see it = decoration
  • When I could possibly move on it, I want to see the action as an option = next action reminder, reviewed when and where it could be done
  • I need to be reminded of this short-term outcome Ive committed to = project list item, reviewed weekly
  • I need to have this when I focus on a project = support material
  • I might want to commit to this at any time in the future = Someday/maybe list item
  • I might want to commit to this on or after a specific time in the future = calendared or tickled item incubated for review on a specific future date
  • I want to achieve this bigger outcome = goals, objectives, visions that you review on some longer interval
  • Its something someone else is doing that I care about = item on Waiting-For list, reviewed at least weekly
  • I need to consider it when I do certain recurring activities = item on a checklist

: :- from David Allen's Productivity Principles newsletter


See Also:

Gadgets and Electronics

Digital Cameras

PocketPC

DVD Players

Camcorders

  • Sony DCR-HC40?

iPod

Cell Phones

DVR

GPS

  • Geocaching
  • GPS Software
    • G7ToWin
      • G7ToWin is designed to transfer data between Garmin, Magellan, or Lowrance/Eagle GPS units and a PC.
      • G7ToWin supports download (transfer from the GPS to the PC) of waypoints, track logs, routes, events (Lowrance/Eagle units only), and for those units which support it, downloading a copy of the current display as a Windows bitmap.
      • G7ToWin supports upload (transfer from the PC to the GPS) all of the above except for the display, display bitmaps cannot be sent to the GPS.
      • Waypoints, routes, events, and track logs can be edited by G7ToWin and stored to various file types. Downloaded display bitmaps cannot be edited, however, they can be rotated. Display bitmaps may also be saved in a standard Windows .bmp file.
      • g7tosource.zip: G7To Source Code
    • GSAK (Geocaching Swiss Army Knife)
      • GSAK is the all in one Geocaching and waypoint management tool. Major features include: Multiple databases, sending/receiving waypoints to GPSr, conversion to many mapping formats, HTML output, extensive searching, macro support, backup and restore, distance/direction from other waypoints (including caches, locations, post codes) and much more.
    • EasyGPS
      • EasyGPS is the fast and easy way to create, edit, and transfer waypoints and routes between your computer and your GPS
    • GPSBabel
      • GPSBabel converts waypoints, tracks, and routes from one format to another, whether that format is a common mapping format like Delorme, Streets and Trips, or even a serial upload or download to a GPS unit such as those from Garmin and Magellan.
      • GPSBabel runs on Microsoft Windows 95, 98, ME, 2000, and XP plus POSIX OSes such as Linux, UnixWare, OpenServer, Solaris, FreeBSD, and OSX.
      • It contains extensive data manipulation abilities making it a convenient for server-side processing or as the backend for other tools.
    • GPS Utility
      • GPS Utility is an easy-to-use application that allows you to manage, manipulate and map your GPS information.
    • GARtrip
      • Software for managing your valuable collection of waypoints, planning your routes, and analyzing your tracks
    • OziExplorer
      • Upload and download of waypoints, routes and tracks, and most makes of GPS receivers for on screen tracking of GPS position (moving map).
  • Garmin GPSMAP 60CS
  • Other GPS Product Info
  • Sites

-- KevinJarnot - 25 Nov 2004

Classic Gaming Emulation

Nintendo SNES

  • ZSNES - SNES emulator for Windows and Linux
  • SNES9X - SNES emulator for Windows, Mac OS X, Linux and Solaris

Nintendo 64

  • Project64 - Nintendo 64 emulator for Windows

Nintendo Gameboy

Arcade Games

Garmin GPSMAP 60CS Info

Garmin Stuff

Accessories

Misc Links

Forums

FAQs

  • How do you display the software version?
    • Menu, Menu, Setup, Enter, System, Enter, Menu, Software Version, Enter
  • How do you determine the amount of free/used memory?
    • Cannot display on unit. Mapsource will show amount of memory free.
  • How do you delete map data on the unit?
    • You don't. When you upload new mapset data it will overwrite existing mapset on unit.
  • How do you set it for geocache mode?
    • Press Menu, Menu, go to Setup, press Enter, go to Routing, press Enter, and set Guidance Method (the first drop down) to "Prompted".
    • Then when you press Goto on the cache, it will prompt you. Select Off Road.
    • You also have to make sure the icon used for the cache's waypoint in the unit matches the icon assigned in the GeoCaching menu
  • How do you reset the 60CS?
    • Hold enter while powering up to enter test mode.
    • Hold enter and page while powering up to master reset the unit. The 76C and 76CS should use the same key strokes as they use the same firmware.
    • You now need to allow the unit to collect a full almanac before normal can be resumed.
      • First a fix will need to be obtained which can take from 5 to 10 minutes of leaving your unit outdoors, stationary, with a good sky view.
      • After the first lock you will need another 12.5 to 15 minutes to get the almanac reloaded.
      • Check the date to insure that the information was reloaded properly. Time will be shown as UTC time since your local time offset was lost in the reset.
      • Re-establish all of your preferences such as time zone, daylight savings flag, etc.
      • Reload all your waypoints and saved routes from your backup.
      • WAAS capable receivers will have to re-establish the WAAS almanac as well.
  • How do you get WAAS working on the 60CS?
  • Is there a way to make the geocache symbols not show without deleting them?
    • You can choose under Map Setup at which zoom level you want user waypoints (geocaches) to show on the map
    • Go to map screen then push menu button, go to map setup then to the points screen, then user waypoints.
  • How do I save batteries?
    • To save a little bit more power you can leave the GPS on the Menu Page, which does not update except for the time at the bottom and the menu bar at the top.
  • How do I reset the odometer?
    • Go to the Trip Computer page (hit page until you get there)
    • Press Menu
    • Choose Reset
    • Choose which field you'd like to reset
    • Scroll down to 'Apply'
    • Press Enter.
  • How do I switch between "follow road" and "off road"?
    • When you're navigating a go-to, press Menu. Recalculate may be one of your choices if you're on the compass page or the map page. If it's not highlighted out, you can select it from that point and it will then ask you if you want to recalculate on or off road. Choose which one you want and press Enter.
    • If you can't choose 'Recalculate', I press 'Find-Find' which then gets me back to my "Recent Finds" page. Odds are usually high that the cache I want to recalculate my distance to is right at the top (if not, find it in the list). Scroll to where you're going, press Enter, scroll to GOTO and press Enter. If you've set up your options correctly in your setup (Menu-Menu-Setup-Routing-PROMPTED) you'll once again be given the choice as to whether you want to navigate on or off road.
  • When I'm hooked up to the USB cable, is the GPSr using its batteries, or does it get power from the USB cable?
    • It uses its batteries. It doesn't draw power through its mini USB connection.
  • My map keeps spinning. Can anyone tell me how to get the map to turn right side up?
    • Set the map to "North Up" instead of "Track Up". Go to Menu-->Map Setup and on the General page, select "North Up" instead of "Track Up" on the "Orientation" drop down list. (See manual p 49 for the 60C, p60 for the 60CS)
  • What is the little circle silver with red dot bug that travels around the outer ring with N/S/E/W? Does it represent the sun location or what?
    • The circle with the red dot is your direction of travel. Yes it moves around when standing still because GPSR commercial units are not exact. If you were moving and come to a stop it will remain pointing in the direction you were traveling unless due to the previously mentioned GPS accuracy it thinks you have moved in another direction.
  • Once in a while, one of the satellite bars has a "D" on it? Is it related to WAAS?
    • The 'D' stands for timing differential. This means you received a timing differential update on that specific satellite. The regular GPSRs owned by us in the public sector typically only receive this update through a signal sent from the WAAS satellites. You can receive a timing differential update on any of the satellites that you are currently receiving. WAAS Satellites are any satellite you are receiving with a number of 33 or higher.

-- KevinJarnot - 21 Apr 2005

Get WAAS Working on a Garmin GPS

  1. Study the map of WAAS GEO satellites and determine which ones you are going to be able to see from your location. From the west coast of the US you can access number 47 and number 35 while from the east coast you can only see number 35. (Also the EGNOS 33 of course.)
  2. Find a place with a clear sky view in the direction of the WAAS GEO satellites you are interested in. If necessary set a waypoint to their approximate location so that you can use the GPS itself to provide a bearing to the satellite. For the USA GEOS 35 is at Lat 0 and Lon 54 West while 47 is at Lat 0 and Lon 178 East. For the European EGNOS system satellite 33 is at Lat 0 Lon 15.5 West and 44 is at Lon 65.5 East. (A new third Satellite called ESA Artemus is at Lon 21.5 East and is expected to come online for Navigation use in the October 2003 and is not shown on the above map.)
  3. Be sure that your GPS is set to normal mode (not battery save) for this procedure. The nature of WAAS corrections precludes its use in Garmin battery save mode.
  4. Enable WAAS on your GPS and notice that it takes the last two locations on the satellite page to display WAAS Geo activity. It will cycle through all of the 19 possible satellite locations 2 at a time and then repeat until two candidate satellites are found. It stays at one setting for about 45 to 50 seconds and then selects a new pair of SV's to look for. When it doesn't have a loaded almanac it will show the SV's on top of the N indicator on the satellite page.
  5. When it reaches the ones you know it should see you need to make sure that the SV shows some receive strength. It it doesn't then reposition the unit in an attempt to find either a location or a direction that will cause the signal bar to appear. You only have 45 seconds so you need to try several positions to get that signal bar. Point directly at the SV, change the angle slightly (up to 90 degrees) and tilt the antenna in the direction of the SV, leave it in each trial position for a few seconds and if not successful then try another setting. You may need to move a little. The tree you thought was out of the way may be blocking the signal.
  6. Once the satellite strength bar appears you are home free. It will not move off of that SV any longer although the second position will continue to hunt for another SV unless it too gets a signal bar. You can reposition slightly to help the second one lock on as well but be careful that you don't lose the first one.
  7. Hold the unit until the full Almanac gets loaded. This will be indicated by the satellite(s) assuming the correct position on the page and will usually turn solid (but this is not a requirement). The figure on the right shows two GEO SV's in position from a location in California. When the satellite is in position and collecting data it will also begin working by starting to display small D's on the other satellite bars to indicate that they are in differential mode. It can take up to 5 minutes to load the almanac data and if it misses any of the data you could wait another 5 minutes for it to come around again. If it grabs an SV that does not have land data for your area it could take quite a while for it to figure this out, but it will eventually supply some amount of differential correction.
  8. If the unit seems to ignore a satellite you know it should see and then switches and moves on to other satellites without generating a signal bar then you may need to re-evaluate your location and find a better spot with a few in the direction of the satellite. You will need to wait until it gets back to your satellite location before trying again. If you are searching for a low number you may speed up the search by resetting the search to begin at the beginning by turning off the unit or disabling and reenabling WAAS mode. Note that during this early phase of WAAS/EGNOS/MSAS it is likely that the system may be in test mode and not be supplying consistent data. Therefore you may see delays in lock and outages like the signal suddenly being reset, however in the US these outages are rapidly becoming a thing of the past since the system has settled down and is considered to be nearly operational.
  9. Once you have one or two SV's locked you are ready to use WAAS mode. Congratulations. The unit knows whether it is in a location where there are one or two satellites available so if you collect the almanac and the unit determines only one satellite is available it will give the second channel back to the GPS for normal GPS satellite use.

-- KevinJarnot - 21 Apr 2005

Getting Technology Contracts Right

from http://www.theregister.co.uk/2004/04/01/getting_technology_contracts_right/

Getting technology contracts right By Taylor Walton (tim.cook at taylorwalton.co.uk) Published Thursday 1st April 2004 13:56 GMT

This article is essential reading for both buyers and suppliers of technology and discusses some key points for getting technology contracts right.

Here, we focus on the supplier's perspective but, by definition, that also indicates important points for buyers.

1. Pre-Contract Issues

(i) Do you need a contract?

Whether you are a customer or a supplier of technology goods and services, you need an appropriate contract for every deal.

Businesses, technology itself and (importantly) the legal background are all constantly evolving and this means that nothing is "standard".

Also every deal has its own legal, commercial and financial issues. For example the relatively new trend known as utility computing (in essence meaning that customers share resources and suppliers charge customers only for resources actually used) is a change that will impact on technology supply contracts where a supplier wants to charge on a utility computing basis.

So because of constant change you do need a contract and the contract must be appropriate to the circumstances. Any business that just signs on the dotted line is asking for trouble.

(ii) Contract management

The purpose of a contract is simple: to represent as closely as possible, in writing, the deal agreed between the parties. That purpose is lost if a contract is stuck in the filing cabinet and forgotten.

Deals can change and often contracts should be treated as a work in progress and reviewed and updated.

As a supplier you must be quite clear before you sign a contract on what the customer wants and who has responsibility under the contract. Are you as supplier taking responsibility for providing a system or services to the customer or does the customer's IT department want some control or total control (for example on procurement decisions)? Suppliers don't want to be in a situation where the IT department is telling you what to do but you have responsibility if it all goes wrong. Split responsibility can lead to disaster.

(iii) Pre-contract Statements/ Written records

Remember that pre-contract statements may become a term of the contract itself.

Also any letters, memos and e-mails must be disclosed in legal proceedings if they are relevant to the issues in a dispute (even if they are marked "private and confidential").

Statements made in a pre-contract letter helped achieve success for a Taylor Walton client recently. The client was an advertising agency which bought a new agency management software package. The client did make clear in pre-contract negotiations that a number of functions were essential. The system failed to achieve these functions and our client issued a claim for a five figure sum being the purchase price and damages. An important argument for the client was that the supplier had confirmed in a pre-contract letter that the system would achieve the essential functions and that the letter formed part of the terms of the contract. Our client settled the claim and the supplier repaid nearly all of the purchase price.

So, beware of "sales talk" before the contract is signed and of recording anything in writing that you would not be happy to read in a court of law.

2. The Contract

(i) Offer/ Acceptance

First things first. You need to be sure that your contract terms are part of the contract at all. The terms that are "on the table" at the moment you accept an offer are the only terms that apply. If you accept an order on the telephone, by post, by fax or on a website and do not make it clear that terms apply then the terms are probably not a part of the contract at all.

Some very big companies fall into this trap: Kodak advertised £300 digital cameras on its website at a price of £100 for a few hours in 2002. Thousands of orders were placed by the time Kodak corrected the error. It was reported that Kodak initially refused to supply the cameras saying in correspondence that "all offers placed on the website legally constitute offers to purchase from us" and that Kodak was "entitled to accept or reject them". In fact it is reported that Kodak's website automatically confirmed receipt of the orders using wording that was considered to amount to legal acceptance. At least one customer threatened a lawsuit and Kodak ultimately agreed to supply the cameras.

This is reported to have cost Kodak about two million pounds. For suppliers it is essential to clarify how and when orders will be accepted and contracts made.

We have a free information sheet on contract making procedures - feel free to email me and I will send a copy.

(ii) Services/ Price Reviews

We often recommend that technology contracts allow some mechanism for making changes to the scope of services.

Suppliers should consider how flexible they are prepared to be and the risks of flexibility. A straightforward example is, if the contract says that the supplier will service all the customer's offices and the customer opens offices abroad then the contract may become unprofitable.

There was a temptation in the past for suppliers to shy away from detailed written service level agreements (or SLAs) on the basis that if no particular measure of efficiency was agreed in writing then it would be difficult for the customer to sue on unfulfilled expectations. Where the obligations of the supplier were not clear from the SLA the courts tended to lean over backwards to help the customer. There is an advantage to suppliers in agreeing a detailed SLA that confirms what is in and out of the box. Customers may prefer less detail and would usually be happy if the SLA says simply that "the supplier will supply all IT services required by the customer". A good SLA will reflect common sense project discussions and seek a balance of interests.

Pricing may need to adapt to any changes in services or SLA's. In technology contracts pricing is often fixed price or time and materials. If prices are fixed over a period then price increases will need consideration (customers will often seek to limit increases to the rate of inflation or an agreed percentage).

The answer may be an appropriate change control procedure in your contracts which can be used to vary the scope of services and pricing. Of course it is preferable that any change is at the supplier's discretion rather than the customer's.

(iii) Specification

If things go wrong, one of the documents a lawyer will look at is the specification as it should help to define in as much detail as possible the output required.

If your contract includes a specification, get it checked by a technology lawyer. I am not suggesting that lawyers should get involved in considering the technical content of Specifications but they should at least check that the Specification is clearly a part of the contract. Our litigation team has advised on cases where one party wants to rely on the content of a Specification but couldn't because it was not a part of the contract at all.

(iv) Intellectual property

By intellectual property I mean valuable information and ideas, as well as the more familiar registered intellectual property rights (such as patents, trademarks, designs) and unregistrable intellectual property rights (such as confidence and copyright).

A supplier should in all contracts (at the very least):

(a) Protect any intellectual property that forms part of its core business.

(b) Agree (at the outset of the deal) either ownership or at least a licence to use intellectual property developed during the course of the contract. That is particularly important if the development of the intellectual property is funded by the customer as there may be a presumption that the customer owns it.

(c) Remember that there may also be third party intellectual property rights which are licensed to the customer. If so the supplier will need a licence to any third party intellectual property which it needs to access in order to supply services.

Check that at least these three elements are considered in all technology contracts and there may be more: intellectual property can be one of the more complex parts of a contract.

(v) Software licensing

Customers tend to regard themselves as buying a perpetual right to use software. But suppliers will seldom (if ever) give an unrestricted right to use and exploit software. Suppliers should consider at least:

(a) the scope of the licence granted (including the length of the term, geographical limitations, maximum users etc), and

(b) the circumstances in which they may want to terminate the licence (for example breach of contract, insolvency or change of control of the licensee).

In a recent case, a supplier supplied websites built from the supplier's proprietary template. The supplier's standard terms reserved intellectual property rights and granted only a non-exclusive licence to its customers. One customer complained of copyright infringement because a competitor was operating a virtually identical website which came from the same supplier. The customer had no grounds for a complaint because it did not own the copyright or have an exclusive right to use it.

This was probably a case where the customer did not check or understand the meaning of the licence terms and shows that it is very important to consider what type of licence is right for the circumstances.

(vi) Limitation of liability

A limitation of liability is a ceiling on the amount of damages that can be claimed by one party for a breach of a contract or other failure by the other party. These clauses are important because they allow a supplier and its insurers to predict the maximum amount for which they will be liable if the contract goes wrong.

Under the Unfair Contract Terms Act courts can consider whether a limitation of liability is reasonable and, if not, you will not be able to rely on it.

A supplier wants limitations in the contract and he wants them to be as low as possible while still being reasonable.

In order to pinpoint a limitation of liability that is appropriate to a particular deal and that is likely to be reasonable, suppliers should consider issues such as:

(a) the level of the supplier's insurance coverage,

(b) the scope of the supplier's obligations,

(c) any agreed service credit/ liquidated damages, and

(d) the likely cost of a failure on the customer's business.

But remember that a court will consider all the circumstances when deciding if a limitation is reasonable.

In the important case of Watford Electronics v Sanderson. The claimant, Watford Electronics sold computer products. Watford bought a new software system from Sanderson in February 1993. The software did not perform well and problems continued until 1996 when Watford gave up, bought a new system from a different supplier and claimed £5.5 million pounds damages (including loss of profits).

Sanderson's limitation clauses limited its liability to the price paid for the system, (about £100,000) and excluded loss of profits.

The Court of Appeal decided that both the clause excluding loss of profits and the clause restricting liability to the price paid for the system were reasonable for the following main reasons:

(a) Watford knew of the limitation and had similar limitations in its own contracts.

(b) The parties negotiated the price and Watford secured price reductions.

(c) The parties were of equal bargaining power.

The case law on limitation of liability is always changing and it is always wise to seek a technology lawyer's advice on limitations that are likely to be reasonable in the particular circumstances.

We also have a free information sheet on excluding and limiting liability in business contracts - again just email me and I will send a copy.

(vii) Liquidated damages

An alternative to limitation of liability clauses are liquidated damages clauses. Under liquidated damages clauses, specified breaches of the contract will attract pre-agreed financial damages (e.g. if the system is down for more than 1 per cent of 1 year, we will pay you £x for each additional 1 per cent of downtime).

Apart from the difficulties involved in agreeing a formula for liquidated damages and then monitoring the supplier's performance against which any damages are payable, the damages clause must be a genuine estimate of the loss that will be caused by a failure or the damages clause will be deemed to be a penalty and automatically void. Some customers tend to feel more comfortable loading all the risk onto the supplier, imposing harsh liquidated damages clauses and sitting back expecting the supplier to deliver in the belief that they can rely on the damages clause if it all goes wrong.

This is not necessarily the best approach for a successful contract. Firstly as I just mentioned penalties are not enforceable anyway. Secondly the individuals on the ground actually delivering the services are not always aware of liquidated damages clauses and so they do not necessarily incentivise the supplier. And thirdly damages are rarely a substitute for having a system that works.

(viii) Distance Selling

In contracts made at a distance between a technology supplier and a consumer, there must be a distance selling regulations clause in the contract.

Distance contracts include contracts made on the telephone or on a website.

Under the Distance Selling Regulations consumers have a right to cancel most contracts. The right will last for seven days unless the supplier does not comply with the Regulations in which case the right to cancel will last for three months.

(ix) Termination

The supplier will want to exit the contract in certain circumstances (e.g customer's insolvency or breach of the contract (e.g. non-payment)). The contract must be clear as to how and when a party can terminate.

Also think about what is required by both parties on termination. For example a terminating supplier may want to get back all its intellectual property and be paid immediately (rather than after the typical thirty days).

(x) Data protection

The Data Protection Act regulates how businesses can use personal data. Personal data is any information that can identify an individual (name, address, email address, financial details, photographs or CCTV images are all included). All businesses process personal data which commonly relates to customers, staff, suppliers and other business contacts.

Along with the majority of organisations, many technology companies have yet to fully realise the impact that the Data Protection Act has on all businesses. It is more than four years since the Act came in to force, and many legal experts are predicting that 2004 is the year in which the initial leniency shown by the Information Commissioner will end and enforcement action will begin against businesses that do not comply.

The Data Protection Act carries criminal liability and unlimited fines in some circumstances and should not be ignored.

There remains a common misconception among businesses that some are exempt from the Data Protection Act. There are no exemptions from the Act at all (there are exemptions from small parts of it such as going on the register) but not from complying with the Act. Even MI5 has to comply.

Taylor Walton supplies a data protection audit service which is free of charge in most cases, again email me if interested. But for the moment a couple of matters of relevance to technology suppliers:

(a) If a supplier is able to access any personal data held by the customer the Act requires that there is a written contract between the customer and the supplier requiring the supplier to maintain appropriate levels of security. One example of this situation might be where the supplier has access to the customer's client database for the purposes of supplying IT support or outsourced services.

(b) If any personal data is to be sent outside of the European Economic Area then this must be either with the consent of the individuals concerned, or to an EC approved territory or under EC approved contractual clauses.

Although the Act is quite complicated and a bit of a maze, putting compliance measures in place is not as much of a headache as most people think.

3. Conclusions

So those are some key issues which are often important in technology deals. It is not possible to consider in detail all important issues in a short article but here are a few key points to take away:

(i) Clarify the output required at the beginning (what does the customer want and what can be achieved - more tests and pilots up front may delay delivery but could prove to be time and money well spent).

(ii) Clearly allocate the risk under the contract to the party that is best able to manage it (and different risks may be best managed by different parties) and then importantly leave that party to manage the risk.

(iii) Make sure the contract is flexible enough to allow changes to be worked into it as the circumstances develop (if technology changes, a supplier may want to ask "This is what my technology can do, is it useful to you?" and as the business develops a customer may want to say "My business processes are changing, please adapt the system/ services so that it supports a different process").

(iv) If it is appropriate to the particular project, incorporate an end to end project plan into the contract listing both customer and supplier dependencies and have regular review meetings.

(v) Finally and most importantly you must have a good starting point for all deals (so your standard supply terms have to be robust). If you are starting from a good starting point then you should need less time, effort and cost to sort out each contract.

Businesses without good standard contractual documentation could face expensive legal problems and suffer commercial disadvantage which competitors may be avoiding.

Again email me if you have any concerns or feel that standard contracts need to be reviewed.

Taylor Walton supplies a comprehensive range of commercial legal services. If you would like to discuss the content of this article or any other commercial matter, please email Mike Pettit (mike.pettit@taylorwalton.co.uk) or Tim Cook (tim.cook@taylorwalton.co.uk) or call Taylor Walton on 01582 731161.

© Taylor Walton (http://www.taylorwalton.co.uk) 2004. All rights reserved.

© Copyright 2005

-- KevinJarnot - 12 Jan 2005

Hosting Hints

Articles

Misc Links

-- KevinJarnot - 07 Jan 2005

How Permanent is Your CD-R?

Originally from http://www.warehousephoto.com/How_Permanent_is_your_CD-R.htm

Image permanence for C D-R’s (Compact Dick Recordable) is an area that is not well known or understood by the general consumer or by many photo labs. Contrary to popular belief, most CD-R’s are not permanent and low priced CD-R’s may not be readable, at all, and error in as little as two years. An inexpensive CD-R is great for moving files from one PC to another, but risky if being used to archive files or images. Quality CD-R’s utilize high quality recording and reflective layers and are well sealed to reduce the harmful effects of the human environment.

The material used for the plastic substrate (polycarbonate) of the CD & CD-R is also important, as it need to be gas impermeable. Most plastics are not, but some plastics are better than others. Even more important is the quality and thickness of the top coatings used to seal layers coated on the substrate.

Prerecorded CD’s are made by “stamping” the information into the plastic substrate then an aluminum alloy coating is applied to the “bumpy” stamped surface. The laser either reflects off of this reflective layer and a “1 bit” is determined, or the laser is deflected by the “stamped” bump and a “0” bit is determined. Contrary to popular belief, the recorded layer of a CD/CD-R is not “sandwiched” within the plastic substrate. A clean lacquer protective layer is put on top of the aluminum reflective layer. A label is put on top or a thick ink coating applied. As the CD is read from the plastic side, a paper, plastic or ink label applied to the CD provides extra protection against the data surfaces from being scratched.

CD-R’s are not stamped with data; they are burned with data by the end user. However the plastic polycarbonate is stamped with splines (tracks or lines) for the laser to follow. A recording layer is also referred to as the dye layer and it is sprayed on top of these splines. Four basic chemical formulas are used for the recording layer dye: 1.Cyanine / light green/blue in color, costs less to make, most common and lowest permanence 2.Phthalocyanine / transparent with a slight green tint, Highest permanence and second most common 3.Metallize Azo / blue, Similar in quality to Phthalocyanine, costs less to make and are not common 4.Formazan / light green, combination of Cyanine and Phthalocyanine, similar in quality to Phthalocyanine, costs less to make and are not as common

CD-R Manufacturers may modify one of these dyes and create a custom, proprietary formula and/or change the traditional color of the dye. Thus CD-R color cannot accurately be used to determine the type of dye used.

CD read lasers are infrared and are not affected by the color or visible light opacity of the dye. As a result, the recording layer dye color is irrelevant to the laser as it will effortlessly pass through any dye that is not infrared opaque. The dye will become infrared opaque when burned by the write laser.

Some CD-R’s have a colored dye layer in front of the recording layer dye creating colored CD-R’s . Black CD-R’s block visible light from reaching the recording and reflective layer, thus these layers cannot be seen by the eye. Yet the type of black dye used will let the infrared laser pass. Gamers and music experts believe that black CD-R’s produce better quality CD-R’s, but this researcher could not find any scientific evidence to support this claim. However, as a black layer prevents visible light from reaching the recording layer dye (these dyes will fade over time when exposed to visible light), a black layer may increase longevity over an identical grade CD-R when both are stored in the light.

A reflective coating made of silver alloy; pure silver, or pure gold is layered on top of the recording layer. Although silver will show the true color of the recording layer dye, gold will change the eye color because of its yellowish color. The burning laser melts a “pit” into the dye which then blocks the read laser from reflecting back, and a “0 bit” is determined. A good dye burns a nice clean pit so the read laser knows for sure if it is a 0 or 1 bit. If the burn is not clean and the edge is not a clean cut, the CD-R will yield an error.

To protect the coatings lacquer is applied and high quality manufacturers make it nice and thick or will even apply a separate protective coating. Poor quality CD-R’s have very little protection on the coatings and will scratch easily, or worse, delaminate. By writing with a non-water base felt pen, the ink could make its way to the data layer and damage a poorly sealed CD-R. But be aware, even the best coated CD-R’s can be damaged over time by non-water based felt makers.

It is difficult to use CD-R color only as a guide, but as a general guideline, if the CD-R does not have a color tint; it is likely a lower quality silver alloy with a poor dye layer. Blue, Green and faint green CD-R’s will be good if they used quality silver. Unfortunately there is no way to know for sure. Gold CD-R’s are best because when the manufacturer used gold, they us a quality dye. But don’t be fooled by manufacturers that place a gold color label on the non-read side or the ones that add a gold color layer on the read side!

There are several reasons for good or poor C D-R permanence;

  1. Plastic (polycarbonate substrate) is oxygen permeable. Oxygen eventually makes its way through the non-lacquered side ( as well as the lacquered side in some cases) and reaches the reflective layer. As aluminum corrodes when exposed to oxygen and silver corrodes or tarnishes when exposed to sulfides in the air, air reaching the reflective layers will cause corrosion causing a read error. This could happen in as little as two years with poor CD-R’s. Gold CD-R’s are best in this area followed by gold/silver alloy. silver/aluminum alloy is the poorest.

Equally important is the optical quality of the plastic. High optical quality CD-R’s permit the light to pass through the polycarbonate with little or no diffusion permitting a cleaner burn to the dye. The spiral grooves stamped to the CD-R vary by manufacturer. It is easier and cheaper to make a “V” shaped groove than a sharp edge “U” groove. A “V” type stamp will have a higher degree of skipping errors as the laser may not be able to track properly, much like the needle of a phonograph if it does not have enough weight on it. Additionally, the stamp will wear as it stamps CD-R after CD-R resulting in a “U” shaped groove becoming more “V” shaped over time which may lead to errors.

  1. The Dyes used in the recording layer are light sensitive and will react to ambient light and fade over time. Quality CD-R’s use a dye that resists fading. To be safe, store them in the dark.

  1. Humidly may seep through a poor lacquer coating. Quality CD-R’s are well-sealed and resist seepage from markers and moister. To make them last, store in low humidly and use water based markers and write on the center core.

  1. A scratch on the base side can be repaired, but a scratch on the lacquer side renders the CD useless. Quality CD-R’s have a thick protective coating to resist scratches. Archiving reports vary by manufacture, but 70 years would be low for a quality CD-R with the norm being 100 years. Some manufacturers of Gold CD-R’s claim 100-200 years!

You generally get what you pay for. Don’t put those precious images on a CD-R that costs just a few nickels and dimes.

-- KevinJarnot - 23 Sep 2005

How to be a Programmer: A Short, Comprehensive, and Personal Summary

Robert L Read

(Originally from http://samizdat.mines.edu/howto/HowToBeAProgrammer.html)

Copyright © 2002, 2003 Robert L. Read Copyright

Copyright © 2002, 2003 by Robert L. Read. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with one Invariant Section being ‘History (As of February, 2003)’, no Front-Cover Texts, and one Back-Cover Text: ‘The original version of this document was written by Robert L. Read without renumeration and dedicated to the programmers of Hire.com.’ A copy of the license is included in the section entitled ‘GNU Free Documentation License’.

2002

Dedication

To the programmers of Hire.com.

Chapter 1. Introduction

To be a good programmer is difficult and noble. The hardest part of making real a collective vision of a software project is dealing with one's coworkers and customers. Writing computer programs is important and takes great intelligence and skill. But it is really child's play compared to everything else that a good programmer must do to make a software system that succeeds for both the customer and myriad colleagues for whom she is partially responsible. In this essay I attempt to summarize as concisely as possible those things that I wish someone had explained to me when I was twenty-one.

This is very subjective and, therefore, this essay is doomed to be personal and somewhat opinionated. I confine myself to problems that a programmer is very likely to have to face in her work. Many of these problems and their solutions are so general to the human condition that I will probably seem preachy. I hope in spite of this that this essay will be useful.

Computer programming is taught in courses. The excellent books: The Pragmatic Programmer [Prag99], Code Complete [CodeC93], Rapid Development [RDev96], and Extreme Programming Explained [XP99] all teach computer programming and the larger issues of being a good programmer. The essays of Paul Graham[PGSite] and Eric Raymond[Hacker] should certainly be read before or along with this article. This essay differs from those excellent works by emphasizing social problems and comprehensively summarizing the entire set of necessary skills as I see them.

In this essay the term boss to refer to whomever gives you projects to do. I use the words business, company, and tribe, synonymously except that business connotes moneymaking, company connotes the modern workplace and tribe is generally the people you share loyalty with.

Welcome to the tribe.

Chapter 2. Beginner

Personal Skills

Learn to Debug

Debugging is the cornerstone of being a programmer. The first meaning of the verb to debug is to remove errors, but the meaning that really matters is to see into the execution of a program by examining it. A programmer that cannot debug effectively is blind.

Idealists that think design, or analysis, or complexity theory, or whatnot, are more fundamental are not working programmers. The working programmer does not live in an ideal world. Even if you are perfect, your are surrounded by and must interact with code written by major software companies, organizations like GNU, and your colleagues. Most of this code is imperfect and imperfectly documented. Without the ability to gain visibility into the execution of this code the slightest bump will throw you permanently. Often this visibility can only be gained by experimentation, that is, debugging.

Debugging is about the running of programs, not programs themselves. If you buy something from a major software company, you usually don't get to see the program. But there will still arise places where the code does not conform to the documentation (crashing your entire machine is a common and spectacular example), or where the documentation is mute. More commonly, you create an error, examine the code you wrote and have no clue how the error can be occurring. Inevitably, this means some assumption you are making is not quite correct, or some condition arises that you did not anticipate. Sometimes the magic trick of staring into the source code works. When it doesn't, you must debug.

To get visibility into the execution of a program you must be able to execute the code and observe something about it. Sometimes this is visible, like what is being displayed on a screen, or the delay between two events. In many other cases, it involves things that are not meant to be visible, like the state of some variables inside the code, which lines of code are actually being executed, or whether certain assertions hold across a complicated data structure. These hidden things must be revealed.

The common ways of looking into the ‘innards’ of an executing program can be categorized as:

  • Using a debugging tool,
  • Printlining --- Making a temporary modification to the program, typically adding lines that print information out, and
  • Logging --- Creating a permanent window into the programs execution in the form of a log.

Debugging tools are wonderful when they are stable and available, but the printlining and logging are even more important. Debugging tools often lag behind language development, so at any point in time they may not be available. In addition, because the debugging tool may subtly change the way the program executes it may not always be practical. Finally, there are some kinds of debugging, such as checking an assertion against a large data structure, that require writing code and changing the execution of the program. It is good to know how to use debugging tools when they are stable, but it is critical to be able to employ the other two methods.

Some beginners fear debugging when it requires modifying code. This is understandable---it is a little like exploratory surgery. But you have to learn to poke at the code and make it jump; you have to learn to experiment on it, and understand that nothing that you temporarily do to it will make it worse. If you feel this fear, seek out a mentor---we lose a lot of good programmers at the delicate onset of their learning to this fear.

How to Debug by Splitting the Problem Space

Debugging is fun, because it begins with a mystery. You think it should do something, but instead it does something else. It is not always quite so simple---any examples I can give will be contrived compared to what sometimes happens in practice. Debugging requires creativity and ingenuity. If there is a single key to debugging is to use the divide and conquer technique on the mystery.

Suppose, for example, you created a program that should do ten things in a sequence. When you run it, it crashes. Since you didn't program it to crash, you now have a mystery. When out look at the output, you see that the first seven things in the sequence were run successfully. The last three are not visible from the output, so now your mystery is smaller: ‘It crashed on thing #8, #9, or #10.’

Can you design an experiment to see which thing it crashed on? Sure. You can use a debugger or we can add printline statements (or the equivalent in whatever language you are working in) after #8 and #9. When we run it again, our mystery will be smaller, such as ‘It crashed on thing #9.’ I find that bearing in mind exactly what the mystery is at any point in time helps keep one focused. When several people are working together under pressure on a problem it is easy to forget what the most important mystery is.

The key to divide and conquer as a debugging technique is the same as it is for algorithm design: as long as you do a good job splitting the mystery in the middle, you won't have to split it too many times, and you will be debugging quickly. But what is the middle of a mystery? There is where true creativity and experience comes in.

To a true beginner, the space of all possible errors looks like every line in the source code. You don't have the vision you will later develop to see the other dimensions of the program, such as the space of executed lines, the data structure, the memory management, the interaction with foreign code, the code that is risky, and the code that is simple. For the experience programmer, these other dimensions form an imperfect but very useful mental model of all the things that can go wrong. Having that mental model is what helps one find the middle of the mystery effectively.

Once you have evenly subdivided the space of all that can go wrong, you must try to decide in which space the error lies. In the simple case where the mystery is: ‘Which single unknown line makes my program crash?’, you can ask yourself: ‘Is the unknown line executed before or after this line that I judge to be executed in the about the middle of the running program?’ Usually you will not be so lucky as to know that the error exists in a single line, or even a single block. Often the mystery will be more like: ‘Either there is a pointer in that graph that points to the wrong node, or my algorithm that adds up the variables in that graph doesn't work.’ In that case you may have to write a small program to check that the pointers in the graph are all correct in order to decide which part of the subdivided mystery can be eliminated. How to Remove an Error

I've intentionally separated the act of examining a program's execution from the act of fixing an error. But of course, debugging does also mean removing the bug. Ideally you will have perfect understanding of the code and will reach an ‘A-Ha!’ moment where you perfectly see the error and how to fix it. But since your program will often use insufficiently documented systems into which you have no visibility, this is not always possible. In other cases the code is so complicated that your understanding cannot be perfect.

In fixing a bug, you want to make the smallest change that fixes the bug. You may see other things that need improvement; but don't fix those at the same time. Attempt to employ the scientific method of changing one thing and only one thing at a time. The best process for this is to be able to easily reproduce the bug, then put your fix in place, and then rerun the program and observe that the bug no longer exists. Of course, sometimes more than one line must be changed, but you should still conceptually apply a single atomic change to fix the bug.

Sometimes, there are really several bugs that look like one. It is up to you to define the bugs and fix them one at a time. Sometimes it is unclear what the program should do or what the original author intended. In this case, you must exercise your experience and judgment and assign your own meaning to the code. Decide what it should do, and comment it or clarify it in some way and then make the code conform to your meaning. This is an intermediate or advanced skill that is sometimes harder than writing the original function in the first place, but the real world is often messy. You may have to fix a system you cannot rewrite. How to Debug Using a Log

Logging is the practice of writing a system so that it produces a sequence of informative records, called a log. Printlining is just producing a simple, usually temporary, log. Absolute beginners must understand and use logs because their knowledge of the programming is limited; system architects must understand and use logs because of the complexity of the system. The amount of information that is provided by the log should be configurable, ideally while the program is running. In general, logs offer three basic advantages:

  • Logs can provide useful information about bugs that are hard to reproduce (such as those that occur in the production environment but that cannot be reproduced in the test environment).
  • Logs can provide statistics and data relevant to performance, such as the time passing between statements.
  • When configurable, logs allow general information to be captured in order to debug unanticipated specific problems without having to modify and/or redeploy the code just to deal with those specific problems.

The amount to output into the log is always a compromise between information and brevity. Too much information makes the log expensive and produces scroll blindness, making it hard to find the information you need. Too little information and it may not contain what you need. For this reason, making what is output configurable is very useful. Typically, each record in the log will identify its position in the source code, the thread that executed it if applicable, the precise time of execution, and, commonly, an additional useful piece of information, such as the value of some variable, the amount of free memory, the number of data objects, etc. These log statements are sprinkled throughout the source code but are particularly at major functionality points and around risky code. Each statement can be assigned a level and will only output a record if the system is currently configured to output that level. You should design the log statements to address problems that you anticipate. Anticipate the need to measure performance.

If you have a permanent log, printlining can now be done in terms of the log records, and some of the debugging statements will probably be permanently added to the logging system. How to Understand Performance Problems

Learning to understand the performance of a running system is unavoidable for the same reason that learning debugging is. Even if the code you understand perfectly precisely the cost of the code you write, your code will make calls into other software systems that you have little control over or visibility into. However, in practice performance problems are a little different and a little easier than debugging in general.

Suppose that you or your customers consider a system or a subsystem to be too slow. Before you try to make it faster, you must build a mental model of why it is slow. To do this you can use a profiling tool or a good log to figure out where the time or other resources are really being spent. There is a famous dictum that 90% of the time will be spent in 10% of the code. I would add to that the importance of input/output expense (I/O) to performance issues. Often most of the time is spent in I/O in one way or another. Finding the expensive I/O and the expensive 10% of the code is a good first step to building your mental model.

There are many dimensions to the performance of a computer system, and many resources consumed. The first resource to measure is wall--clock time, the total time that passes for the computation. Logging wall-clock time is particularly valuable because it can inform about unpredictable circumstance that arise in situations where other profiling is impractical. However, this may not always represent the whole picture. Sometimes something that takes a little longer but doesn't burn up so many processor seconds will be much better in computing environment you actually have to deal with. Similarly, memory, network bandwidth, database or other server accesses may, in the end, be far more expensive than processor seconds.

Contention for shared resources that are synchronized can cause deadlock and starvation. Deadlock is the inability to proceed because of improper synchronization or resource demands. Starvation is the failure to schedule a component properly. If it can be at all anticipated, it is best to have a way of measuring this contention from the start of your project. Even if this contention does not occur, it is very helpful to be able to assert that with confidence. How to Fix Performance Problems

Most software projects can be made with relatively little effort 10 to 100 times faster than they are at the they are first released. Under time-to-market pressure, it is both wise and effective to choose a solution that gets the job done simply and quickly, but less efficiently than some other solution. However, performance is a part of usability, and often it must eventually be considered more carefully.

The key to improving the performance of a very complicated system is to analyze it well enough to find the bottlenecks, or places where most of the resources are consumed. There is not much sense in optimizing a function that accounts for only 1% of the computation time. As a rule of thumb you should think carefully before doing anything unless you think it is going to make the system or a significant part of it at least twice as fast. There is usually a way to do this. Consider the test and quality assurance effort that your change will require. Each change brings a test burden with it, so it is much better to have a few big changes.

After you've made a two-fold improvement in something, you need to at least rethink and perhaps reanalyze to discover the next-most-expensive bottleneck in the system, and attack that to get another two-fold improvement.

Often, the bottlenecks in performance will be an example of counting cows by counting legs and dividing by four, instead of counting heads. For example, I've made errors such as failing to provide a relational database system with a proper index on a column I look up a lot, which probably made it at least 20 times slower. Other examples include doing unnecessary I/O in inner loops, leaving in debugging statements that are no longer needed, unnecessary memory allocation, and, in particular, inexpert use of libraries and other subsystems that are often poorly documented with respect to performance. This kind of improvement is sometimes called low-hanging fruit, meaning that it can be easily picked to provide some benefit.

What do you do when you start to run out of low-hanging fruit? Well, you can reach higher, or chop the tree down. You can continue making small improvements or you can seriously redesign a system or a subsystem. (This is a great opportunity to use your skills as a good programmer, not only in the new design but also in convincing your boss that this is a good idea.) However, before you argue for the redesign of a subsystem, you should ask yourself whether or not your proposal will make it five to ten time better. How to Optimize Loops

Sometimes you'll encounter loops, or recursive functions, that take a long time to execute and are bottlenecks in your product. Before you try to make the loop a little faster, but spend a few minutes considering if there is a way to remove it entirely. Would a different algorithm do? Could you compute that while computing something else? If you can't find away around it, then you can optimize the loop. This is simple; move stuff out. In the end, this will require not only ingenuity but also an understanding of the expense of each kind of statement and expression. Here are some suggestions:

*

Remove floating point operations. *

Don't allocate new memory blocks unnecessarily. *

Fold constants together. *

Move I/O into a buffer. *

Try not to divide. *

Try not to do expensive typecasts. *

Move a pointer rather than recomputing indices.

The cost of each of these operations depends on your specific system. On some systems compilers and hardware do these things for you. Clear, efficient code is better than code that requires an understanding of a particular platform. How to Deal with I/O Expense

For a lot of problems, processors are fast compared to the cost of communicating with a hardware device. This cost is usually abbreviated I/O, and can include network cost, disk I/O, database queries, file I/O, and other use of some hardware not very close to the processor. Therefore building a fast system is often more a question of improving I/O than improving the code in some tight loop, or even improving an algorithm.

There are two very fundamental techniques to improving I/O: caching and representation. Caching is avoiding I/O (generally avoiding the reading of some abstract value) by storing a copy of that value locally so no I/O is performed to get the value. The first key to caching is to make it crystal clear which data is the master and which are copies. There is only one master---period. Caching brings with it the danger that the copy is sometimes can't reflect changes to the master instantaneously.

Representation is the approach of making I/O cheaper by representing data more efficiently. This is often in tension with other demands, like human readability and portability.

Representations can often be improved by a factor of two or three from their first implementation. Techniques for doing this include using a binary representation instead of one that is human readable, transmitting a dictionary of symbols along with the data so that long symbols don't have to be encoded, and, at the extreme, things like Huffman encoding.

A third technique that is sometimes possible is to improve the locality of reference by pushing the computation closer to the data. For instance, if you are reading some data from a database and computing something simple from it, such as a summation, try to get the database server to do it for you. This is highly dependent on the kind of system you're working with, but you should explore it. How to Manage Memory

Memory is a precious resource that you can't afford to run out of. You can ignore it for a while but eventually you will have to decide how to manage memory.

Space that needs to persist beyond the scope of a single subroutine is often called heap allocated. A chunk of memory is useless, hence garbage, when nothing refers to it. Depending on the system you use, you may have to explicitly deallocate memory yourself when it is about to become garbage. More often you may be able to use a system that provides a garbage collector. A garbage collector notices garbage and frees its space without any action required by the programmer. Garbage collection is wonderful: it lessens errors and increases code brevity and concision cheaply. Use it when you can.

But even with garbage collection, you can fill up all memory with garbage. A classic mistake is to use a hash table as a cache and forget to remove the references in the hash table. Since the reference remains, the referent is noncollectable but useless. This is called a memory leak. You should look for and fix memory leaks early. If you have long running systems memory may never be exhausted in testing but will be exhausted by the user.

The creation of new objects is moderately expensive on any system. Memory allocated directly in the local variables of a subroutine, however, is usually cheap because the policy for freeing it can be very simple. You should avoid unnecessary object creation.

An important case occurs when you can define an upper bound on the number of objects you will need at one time. If these objects all take up the same amount of memory, you may be able to allocate a single block of memory, or a buffer, to hold them all. The objects you need can be allocated and released inside this buffer in a set rotation pattern, so it is sometimes called a ring buffer. This is usually faster than heap allocation.

Sometimes you have to explicitly free allocated space so it can be reallocated rather than rely on garbage collection. Then you must apply careful intelligence to each chunk of allocated memory and design a way for it to be deallocated at the appropriate time. The method may differ for each kind of object you create. You must make sure that every execution of a memory allocating operation is matched by a memory deallocating operation eventually. This is so difficult that programmers often simply implement a rudimentary form or garbage collection, such as reference counting, to do this for them. How to Deal with Intermittent Bugs

The intermittent bug is a cousin of the 50-foot-invisible-scorpion-from-outer-space kind of bug. This nightmare occurs so rarely that it is hard to observe, yet often enough that it can't be ignored. You can't debug because you can't find it.

Although after 8 hours you will start to doubt it, the intermittent bug has to obey the same laws of logic everything else does. What makes it hard is that it occurs only under unknown conditions. Try to record the circumstances under which the bug does occur, so that you can guess at what the variability really is. The condition may be related to data values, such as ‘This only happens when we enter Wyoming as a value.’ If that is not the source of variability, the next suspect should be improperly synchronized concurrency.

Try, try, try to reproduce the bug in a controlled way. If you can't reproduce it, set a trap for it by building a logging system, a special one if you have to, that can log what you guess you need when it really does occur. Resign yourself to that if the bug only occurs in production and not at your whim, this is may be a long process. The hints that you get from the log may not provide the solution but may give you enough information to improve the logging. The improved logging system may take a long time to be put into production. Then, you have to wait for the bug to reoccur to get more information. This cycle can go on for some time.

The stupidest intermittent bug I ever created was in a multi-threaded implementation of a functional programming language for a class project. I had very carefully insured correct concurrent evaluation of the functional program, good utilization of all the CPUs available (eight, in this case). I simply forgot to synchronize the garbage collector. The system could run a long time, often finishing whatever task I began, before anything noticeable went wrong. I'm ashamed to admit I had begun to question the hardware before my mistake dawned on me.

At work we recently had an intermittent bug that took us several weeks to find. We have multi-threaded application servers in Java™ behind Apache™ web servers. To maintain fast page turns, we do all I/O in small set of four separate threads that are different than the page-turning threads. Every once in a while these would apparently get ‘stuck’ and cease doing anything useful, so far as our logging allowed us to tell, for hours. Since we had four threads, this was not in itself a giant problem---unless all four got stuck. Then the queues emptied by these threads would quickly fill up all available memory and crash our server. It took us about a week to figure this much out, and we still didn't know what caused it, when it would happen, or even what the threads where doing when they got ‘stuck’.

This illustrates some risk associated with third-party software. We were using a licensed piece of code that removed HTML tags from text. Due to its place of origin we affectionately referred to this as ‘the French stripper.’ Although we had the source code (thank goodness!) we had not studied it carefully until by turning up the logging on our servers we finally realized that the email threads were getting stuck in the French stripper.

The stripper performed well except on some long and unusual kinds of texts. On these texts, the code was quadratic or worse. This means that the processing time was proportional to the square of the length of the text. Had these texts occurred commonly, we would have found the bug right away. If they had never occurred at all, we would never have had a problem. As it happens, it took us weeks to finally understand and resolve the problem. How to Learn Design Skills

To learn how to design software, study the action of a mentor by being physically present when they are designing. Then study well-written pieces of software. After that, you can read some books on the latest design techniques.

Then you must do it yourself. Start with a small project. When you are finally done, consider how the design failed or succeeded and how you diverged from your original conception. They move on to larger projects, hopefully in conjunction with other people. Design is a matter of judgment that takes years to acquire. A smart programmer can learn the basics adequately in two months and can improve from there.

It is natural and helpful to develop your own style, but remember that design is an art, not a science. People who write books on the subject have a vested interest in making it seem scientific. Don't become dogmatic about particular design styles. How to Conduct Experiments

The late, great Edsger Dijkstra has eloquently explained that Computer Science is not an experimental science[ExpCS] and doesn't depend on electronic computers. As he puts it referring to the 1960s[Knife],

...the harm was done: the topic became known as “computer science”---which, actually, is like referring to surgery as “knife science” --- and it was firmly implanted in people's minds that computing science is about machines and their peripheral equipment.

Programming ought not to be an experimental science, but most working programmers do not have the luxury of engaging in what Dijkstra means by computing science. We must work in the realm of experimentation, just as some, but not all, physicists do. If thirty years from now programming can be performed without experimentation, it will be a great accomplishment of Computer Science.

The kinds of experiments you will have to perform include:

*

Testing systems with small examples to verify that they conform to the documentation or to understand their response when there is no documentation, *

Testing small code changes to see if they actually fix a bug, *

Measuring the performance of a system under two different conditions due to imperfect knowledge of there performance characteristics, *

Checking the integrity of data, and *

Collecting statistics that may hint at the solution to difficult or hard-to-repeat bugs.

I don't think in this essay I can explain the design of experiments; you will have to study and practice. However, I can offer two bits of advice.

First, try to be very clear about your hypothesis, or the assertion that you are trying to test. It also helps to write the hypothesis down, especially if you find yourself confused or are working with others.

You will often find yourself having to design a series of experiments, each of which is based on the knowledge gained from the last experiment. Therefore, you should design your experiments to provide the most information possible. Unfortunately, this is in tension with keeping each experiment simple---you will have to develop this judgment through experience. Team Skills Why Estimation is Important

To get a working software system in active use as quickly as possible requires not only planning the development, but also planning the documentation, deployment, marketing. In a commercial project it also requires sales and finance. Without predictability of the development time, it is impossible to plan these effectively.

Good estimation provides predictability. Managers love it, as well they should. The fact that it is impossible, both theoretically and practically, to predict accurately how long it will take to develop software is often lost on managers. We are asked to do this impossible thing all the time, and we must face up to it honestly. However, it would be dishonest not to admit the impossibility of this task, and when necessary, explain it. There is a lot of room for miscommunication about estimates, as people have a startling tendency to think wishfully that the sentence:

I estimate that, if I really understand the problem, it is about 50% likely that we will be done in five weeks (if no one bothers us during that time).

really means:

I promise to have it all done five weeks from now.

This common interpretation problem requires that you explicitly discuss what the estimate means with your boss or customer as if they were a simpleton. Restate your assumptions, no matter how obvious they seem to you. How to Estimate Programming Time

Estimation takes practice. It also takes labor. It takes so much labor it may be a good idea to estimate the time it will take to make the estimate, especially if you are asked to estimate something big.

When asked to provide an estimate of something big, the most honest thing to do is to stall. Most engineers are enthusiastic and eager to please, and stalling certainly will displease the stalled. But an on-the-spot estimate probably won't be accurate and honest.

While stalling, it may be possible to consider doing or prototyping the task. If political pressure permits, this is the most accurate way of producing the estimate, and it makes real progress.

When not possible to take the time for some investigation, you should first establish the meaning of the estimate very clearly. Restate that meaning as the first and last part of your written estimate. Prepare a written estimate by deconstructing the task into progressively smaller subtasks until each small task is no more than a day; ideally at most in length. The most important thing is not to leave anything out. For instance, documentation, testing, time for planning, time for communicating with other groups, and vacation time are all very important. If you spend part of each day dealing with knuckleheads, put a line item for that in the estimate. This gives your boss visibility into what is using up your time at a minimum, and might get you more time.

I know good engineers who pad estimates implicitly, but I recommend that you do not. One of the results of padding is trust in you may be depleted. For instance, an engineer might estimate three days for a task that she truly thinks will take one day. The engineer may plan to spend two days documenting it, or two days working on some other useful project. But it will be detectable that the task was done in only one day (if it turns out that way), and the appearance of slacking or overestimating is born. It's far better to give proper visibility into what you are actually doing. If documentation takes twice as long as coding and the estimate says so, tremendous advantage is gained by making this visible to the manager.

Pad explicitly instead. If a task will probably take one day---but might take ten days if your approach doesn't work---note this somehow in the estimate if you can; if not, at least do an average weighted by your estimates of the probabilities. Any risk factor that you can identify and assign an estimate to should go into the schedule. One person is unlikely to be sick in any given week. But a large project with many engineers will have some sick time; likewise vacation time. And what is the probability of a mandatory company-wide training seminar? If it can be estimated, stick it in. There are of course, unknown unknowns, or unk-unks. Unk-unks by definition cannot be estimated individually. You can try to create a global line item for all unk-unks, or handle them in some other way that you communicate to your boss. You cannot, however, let your boss forget that they exist, and it is devilishly easy for an estimate to become a schedule without the unk-unks considered.

In a team environment, you should try to have the people who will do the work do the estimate, and you should try to have team-wide consensus on estimates. People vary widely in skill, experience, preparedness, and confidence. Calamity strikes when a strong programmer estimates for herself and then weak programmers are held to this estimate. The act of having the whole team agree on a line-by-line basis to the estimate clarifies the team understanding, as well as allowing the opportunity for tactical reassignment of resources (for instance, shifting burden away from weaker team members to stronger).

If there are big risks that cannot be evaluated, it is your duty to state so forcefully enough that your manager does not commit to them and then become embarrassed when the risk occurs. Hopefully in such a case whatever is needed will be done to decrease the risk.

If you can convince your company to use Extreme Programming, you will only have to estimate relatively small things, and this is both more fun and more productive. How to Find Out Information

The nature of what you need to know determines how you should find it.

If you need information about concrete things that are objective and easy to verify, for example the latest patch level of a software product, ask a large number of people politely by searching the internet for it or by posting on a discussion group. Don't search on the internet for anything that smacks of either opinion or subjective interpretation: the ratio of drivel to truth is too high.

If you need general knowledge about something subjective the history of what people have thought about it, go to the library (the physical building in which books are stored). For example, to learn about math or mushrooms or mysticism, go to the library.

If you need to know how to do something that is not trivial get two or three books on the subject and read them. You might learn how to do something trivial, like install a software package, from the Internet. You can even learn important things, like good programming technique, but you can easily spend more time searching and sorting the results and attempting to divine the authority of the results than it would take to read the pertinent part of a solid book.

If you need information that no one else could be expected to know for example, ‘does this software that is brand new work on gigantic data sets?’, you must still search the internet and the library. After those options are completely exhausted, you may design an experiment to ascertain it.

If you want an opinion or a value judgment that takes into account some unique circumstance, talk to an expert. For instance, if you want to know whether or not it is a good idea to build a modern database management system in LISP, you should talk to a LISP expert and a database expert.

If you want to know how likely it is that a faster algorithm for a particular application exists that has not yet been published, talk to someone working in that field.

If you want to make a personal decision that only you can make like whether or not you should start a business, try putting into writing a list of arguments for and against the idea. If that fails, consider divination. Suppose you have studied the idea from all angles, have done all your homework, and worked out all the consequences and pros and cons in your mind, and yet still remain indecisive. You now must follow your heart and tell your brain to shut up. The multitude of available divination techniques are very useful for determining your own semi-conscious desires, as they each present a complete ambiguous and random pattern that your own subconscious will assign meaning to. How to Utilize People as Information Sources

Respect every person's time and balance it against your own. Asking someone a question accomplishes far more than just receiving the answer. The person learns about you, both by enjoying your presence and hearing the particular question. You learn about the person in the same way, and you may learn the answer you seek. This is usually far more important than your question.

However, the value of this diminishes the more you do it. You are, after all, using the most precious commodity a person has: their time. The benefits of communication must be weighed against the costs. Furthermore, the particular costs and benefits derived differ from person to person. I strongly believe that an executive of 100 people should spend five minutes a month talking to each person in her organization, which would be about 5% of their time. But ten minutes might be too much, and five minutes is too much if they have one thousand employees. The amount of time you spend talking to each person in your organization depends on their role (more than their position). You should talk to your boss more than your boss's boss, but you should talk to your boss's boss a little. It may be uncomfortable, but I believe you have a duty to talk a little bit to all your superiors, each month, no matter what.

The basic rule is that everyone benefits from talking to you a little bit, and the more they talk to you, the less benefit they derive. It is your job to provide them this benefit, and to get the benefit of communicating with them, keeping the benefit in balance with the time spent.

It is important to respect your own time. If talking to someone, even if it will cost them time, will save you a great deal of time, then you should do it unless you think their time is more valuable than yours, to the tribe, by that factor.

A strange example of this is the summer intern. A summer intern in a highly technical position can't be expected to accomplish too much; they can be expected to pester the hell out of everybody there. So why is this tolerated? Because the pestered are receiving something important from the intern. They get a chance to showoff a little. They get a chance to hear some new ideas, maybe; they get a chance to see things from a different perspective. They may also be trying to recruit the intern, but even if this is not the case there is much to gain.

You should ask people for a little bit of their wisdom and judgment whenever you honestly believe they have something to say. This flatters them and you will learn something and teach them something. A good programmer does not often need the advice of a Vice President of Sales, but if you ever do, you be sure to ask for it. I once asked to listen in on a few sales calls to better understand the job of our sales staff. This took no more than 30 minutes but I think that small effort made an impression on the sales force. How to Document Wisely

Life is too short to write crap nobody will read; if you write crap, nobody will read it. Therefore a little good documentation is best. Managers often don't understand this, because even bad documentation gives them a false sense of security that they are not dependent on their programmers. If someone absolutely insists that you write truly useless documentation, say ``yes'' and quietly begin looking for a better job.

There's nothing quite as effective as putting an accurate estimate of the amount of time it will take to produce good documentation into an estimate to slacken the demand for documentation. The truth is cold and hard: documentation, like testing, can take many times longer than developing code.

Writing good documentation is, first of all, good writing. I suggest you find books on writing, study them, and practice. But even if you are a lousy writer or have poor command of the language in which you must document, the Golden Rule is all you really need: ``Do unto others as you would have them do unto you.'' Take time to really think about who will be reading your documentation, what they need to get out of it, and how you can teach that to them. If you do that, you will be an above average documentation writer, and a good programmer.

When it comes to actually documenting code itself, as opposed to producing documents that can actually be read by non-programmers, the best programmers I've ever known hold a universal sentiment: write self-explanatory code and only document code in the places that you cannot make it clear by writing the code itself. There are two good reasons for this. First, anyone who needs to see code-level documentation will in most cases be able to and prefer to read the code anyway. Admittedly, this seems easier to the experienced programmer than to the beginner. More importantly however, is that the code and the documentation cannot be inconsistent if there is no documentation. The source code can at worst be wrong and confusing. The documentation, if not written perfectly, can lie, and that is a thousand times worse.

This does not make it easier on the responsible programmer. How does one write self-explanatory code? What does that even mean? It means:

*

Writing code knowing that someone will have to read it; *

Applying the golden rule; *

Choosing a solution that is straightforward, even if you could get by with another solution faster; *

Sacrificing small optimizations that obfuscate the code; *

Thinking about the reader and spending some of your precious time to make it easier on her; and *

Not ever using a function name like ``foo'',``bar'', or ``doIt''!

How to Work with Poor Code

It is very common to have to work with poor quality code that someone else has written. Don't think too poorly of them, however, until you have walked in their shoes. They may have been asked very consciously to get something done quickly to meet schedule pressure. Regardless, in order to work with unclear code you must understand it. To understand it takes learning time, and that time will have to come out of some schedule, somewhere, and you must insist on it. To understand it, you will have to read the source code. You will probably have to experiment with it.

This is a good time to document, even if it is only for yourself, because the act of trying to document the code will force you to consider angles you might not have considered, and the resulting document may be useful. While you're doing this, consider what it would take to rewrite some or all of the code. Would it actually save time to rewrite some of it? Could you trust it better if you rewrote it? Be careful of arrogance here. If you rewrite it, it will be easier for you to deal with, but will it really be easier for the next person who has to read it? If you rewrite it, what will the test burden be? Will the need to re-test it outweigh any benefits that might be gained?

In any estimate that you make for work against code you didn't write, the quality of that code should affect your perception of the risk of problems and unk-unks.

It is important to remember that abstraction and encapsulation, two of a programmer's best tools, are particularly applicable to lousy code. You may not be able to redesign a large block of code, but if you can add a certain amount of abstraction to it you can obtain some of the benefits of a good design without reworking the whole mess. In particular, you can try to wall off the parts that are particularly bad so that they may be redesigned independently. How to Use Source Code Control

Source code control systems let you manage projects effectively. They're very useful for one person and essential for a group. They track all changes in different versions so that no code is ever lost and meaning can be assigned to changes. One can create throw-away and debugging code with confidence with a source code control system, since the code you modify is kept carefully separate from committed, official code that will be shared with the team or released.

I was late to appreciate the benefits of source code control systems but now I wouldn't live without one even on a one-person project. Generally they are necessary when you have team working on the same code base. However, they have another great advantage: they encourage thinking about the code as a growing, organic system. Since each change is marked as a new revision with a new name or number, one begins to think of the software as a visibly progressive series of improvements. I think this is especially useful for beginners.

A good technique for using a source code control system is to stay within a few days of being up-to-date at all time. Code that can't be finished in a few days is checked in, but in a way that it is inactive and will not be called, and therefore not create any problems for anybody else. Committing a mistake that slows down your teammates is a serious error; it is often taboo. How to Unit Test

Unit testing, the testing of an individual piece of coded functionality by the team that wrote it, is a part of coding, not something different from it. Part of designing the code is designing how it will be tested. You should write down a test plan, even if it is only one sentence. Sometimes the test will be simple: ``Does the button look good?'' Sometimes it will be complex: ``Did this matching algorithm return precisely the correct matches?''

Use assertion checking and test drivers whenever possible. This not only catches bugs early, but is very useful later on and lets you eliminate mysteries that you would otherwise have to worry about.

The Extreme Programming developers are writing extensively on unit testing effectively; I can do no better than to recommend their writings. Take Breaks when Stumped

When stumped, take a break. I sometimes meditate for 15 minutes when stumped and the problem magically unravels when I come back to it. A night's sleep sometimes does the same thing on a larger scale. It's possible that temporarily switching to any other activity may work. How to Recognize When to Go Home

Computer programming is an activity that is also a culture. The unfortunate fact is that it is not a culture that values mental or physical health very much. For both cultural/historical reasons (the need to work at night on unloaded computers, for example) and because of overwhelming time-to-market pressure and the scarcity of programmers, computer programmers are traditionally overworked. I don't think you can trust all the stories you hear, but I think 60 hours a week is common, and 50 is pretty much a minimum. This means that often much more than that is required. This is serious problem for a good programmer, who is responsible not only for themselves but their teammates as well. You have to recognize when to go home, and sometimes when to suggest that other people go home. There can't be any fixed rules for solving this problem, anymore than there can be fixed rules for raising a child, for the same reason---every human being is different.

Beyond 60 hours a week is an extraordinary effort for me, which I can apply for short periods of time (about one week), and that is sometimes expected of me. I don't know if it is fair to expect 60 hours of work from a person; I don't even know if 40 is fair. I am sure, however, that it is stupid to work so much that you are getting little out of that extra hour you work. For me personally, that's any more than 60 hours a week. I personally think a programmer should exercise noblesse oblige and shoulder a heavy burden. However, it is not a programmer's duty to be a patsy. The sad fact is programmers are often asked to be patsies in order to put on a show for somebody, for example a manager trying to impress an executive. Programmers often succumb to this because they are eager to please and not very good at saying no. There are four defenses against this:

*

Communicate as much as possible with everyone in the company so that no one can mislead the executives about what is going on, *

Learn to estimate and schedule defensively and explicitly and give everyone visibility into what the schedule is and where it stands, *

Learn to say no, and say no as a team when necessary, and *

Quit if you have to.

Most programmers are good programmers, and good programmers want to get a lot done. To do that, they have to manage their time effectively. There is a certain amount of mental inertia associated with getting warmed-up to a problem and deeply involved in it. Many programmers find they work best when they have long, uninterrupted blocks of time in which to get warmed-up and concentrate. However, people must sleep and perform other duties. Each person needs to find a way to satisfy both their human rhythm and their work rhythm. Each programmer needs to do whatever it takes to procure efficient work periods, such as reserving certain days in which you will attend only the most critical meetings.

Since I have children, I try to spend evenings with them sometimes. The rhythm that works best for me is to work a very long day, sleep in the office or near the office (I have a long commute from home to work) then go home early enough the next day to spend time with my children before they go to bed. I am not comfortable with this, but it is the best compromise I have been able to work out. Go home if you have a contagious disease. You should go home if you are thinking suicidal thoughts. You should take a break or go home if you think homicidal thoughts for more than a few seconds. You should send someone home if they show serious mental malfunctioning or signs of mental illness beyond mild depression. If you are tempted to be dishonest or deceptive in a way that you normally are not due to fatigue, you should take a break. Don't use cocaine or amphetamines to combat fatigue. Don't abuse caffeine. How to Deal with Difficult People

You will probably have to deal with difficult people. You may even be a difficult person yourself. If you are the kind of person who has a lot of conflicts with coworkers and authority figures, you should cherish the independence this implies, but work on your interpersonal skills without sacrificing your intelligence or principles.

This can be very disturbing to some programmers who have no experience in this sort of thing and whose previous life experience has taught them patterns of behavior that are not useful in the workplace. Difficult people are often inured to disagreement and they are less affected by social pressure to compromise than others. The key is to respect them appropriately, which is more than you will want to but not as much as they might want.

Programmers have to work together as a team. When disagreement arises, it must be resolved somehow, it cannot be ducked for long. Difficult people are often extremely intelligent and have something very useful to say. It is critical that you listen and understand the difficult person without prejudice caused by the person. A failure to communicate is often the basis of disagreement but it can sometimes be removed with great patience. Try to keep this communication cool and cordial, and don't accept any baits for greater conflict that may be offered. After a reasonable period of trying to understand, make a decision.

Don't let a bully force you to do something you don't agree with. If you are the leader, do what you think is best. Don't make a decision for any personal reasons, and be prepared to explain the reasons for your decision. If you are a teammate with a difficult person, don't let the leader's decision have any personal impact. If it doesn't go your way, do it the other way whole-heartedly.

Difficult people do change and improve. I've seen it with my own eyes, but it is very rare. However, everyone has transitory ups and downs.

One of the challenges that every programmer but especially leaders face is keeping the difficult person fully engaged. They are more prone to duck work and resist passively than others. Chapter 3. Intermediate

Table of Contents

Personal Skills

How to Stay Motivated How to be Widely Trusted How to Tradeoff Time vs. Space How to Stress Test How to Balance Brevity and Abstraction How to Learn New Skills Learn to Type How to Do Integration Testing Communication Languages Heavy Tools How to analyze data

Team Skills

How to Manage Development Time How to Manage Third-Party Software Risks How to Manage Consultants How to Communicate the Right Amount How to Disagree Honestly and Get Away with It

Judgement

How to Tradeoff Quality Against Development Time How to Manage Software System Dependence How to Decide if Software is Too Immature How to Make a Buy vs. Build Decision How to Grow Professionally How to Evaluate Interviewees How to Know When to Apply Fancy Computer Science How to Talk to Non-Engineers

Personal Skills How to Stay Motivated

It is a wonderful and surprising fact that programmers are highly motivated by the desire to create artifacts that are beautiful, useful, or nifty. This desire is not unique to programmers nor universal but it is so strong and common among programmers that it separates them from others in other roles.

This has practical and important consequences. If programmers are asked to do something that is not beautiful, useful, or nifty, they will have low morale. There's a lot of money to be made doing ugly, stupid, and boring stuff; but in the end, fun will make the most money for the company.

Obviously, there are entire industries organized around motivational techniques some of which apply here. The things that are specific to programming that I can identify are:

*

Use the best language for the job. *

Look for opportunities to apply new techniques, languages, and technologies. *

Try to either learn or teach something, however small, in each project.

Finally, if possible, measure the impact of your work in terms of something that will be personally motivating. For example, when fixing bugs, counting the number of bugs that I have fixed is not at all motivational to me, because it is independent of the number that may still exist, and is also affects the total value I'm adding to my company's customers in only the smallest possible way. Relating each bug to a happy customer, however, is personally motivating to me. How to be Widely Trusted

To be trusted you must be trustworthy. You must also be visible. If know one knows about you, no trust will be invested in you. With those close to you, such as your teammates, this should not be an issue. You establish trust by being responsive and informative to those outside your department or team. Occasionally someone will abuse this trust, and ask for unreasonable favors. Don't be afraid of this, just explain what you would have to give up doing to perform the favor.

Don't pretend to know something that you don't. With people that are not teammates, you may have to make a clear distinction between ``not knowing right off the top of my head'' and ``not being able to figure it out, ever.'' How to Tradeoff Time vs. Space

You can be a good programmer without going to college, but you can't be a good intermediate programmer without knowing basic computational complexity theory. You don't need to know ``big O'' notation, but I personally think you should be able to understand the difference between ``constant-time'',``n log n'' and ``n squared''. You might be able to intuit how to tradeoff time against space without this knowledge, but in its absence you will not have a firm basis for communicating with your colleagues.

In designing or understanding an algorithm, the amount of time it takes to run is sometimes a function of the size of the input. When that is true, we can say an algorithm's worst/expected/best-case running time is ``n log n'' if it is proportional to the size ($n$) times the logarithm of the size. The notation and way of speaking can be also be applied to the space taken up by a data structure.

To me, computational complexity theory is beautiful and as profound as physics---and a little bit goes a long way!

Time (processor cycles) and space (memory) can be traded off against each other. Engineering is about compromise, and this is a fine example. It is not always systematic. In general, however, one can save space by encoding things more tightly, at the expense of more computation time when you have to decode them. You can save time by caching, that is, spending space to store a local copy of something, at the expense of having to maintain the consistency of the cache. You can sometimes save time by maintaining more information in a data structure. This usually cost a small amount of space but may complicate the algorithm.

Improving the space/time tradeoff can often change one or the other dramatically. However, before you work on this you should ask yourself if what you are improving is really the thing that needs the most improvement. It's fun to work on an algorithm, but you can't let that blind you to the cold hard fact that improving something that is not a problem will not make any noticeable difference and will create a test burden.

Memory on modern computers appears cheap, because unlike processor time, you can't see it being used until you hit the wall; but then failure is catastrophic. There are also other hidden costs to using memory, such as your effect on other programs that must be resident, and the time to allocate and deallocate it. Consider this carefully before you trade away space to gain speed. How to Stress Test

Stress testing is fun. At first it appears that the purpose of stress testing is to find out if the system works under a load. In reality, it is common that the system does work under a load but fails to work in some way when the load is heavy enough. I call this hitting the wall or bonking[1]. There may be some exceptions, but there is almost always a ‘wall’. The purpose of stress testing is to figure out where the wall is, and then figure out how to move the wall further out.

A plan for stress testing should be developed early in the project, because it often helps to clarify exactly what is expected. Is two seconds for a web page request a miserable failure or a smashing success? Is 500 concurrent users enough? That, of course, depends, but one must know the answer when designing the system that answers the request. The stress test needs to model reality well enough to be useful. It isn't really possible to simulate 500 erratic and unpredictable humans using a system concurrently very easily, but one can at least create 500 simulations and try to model some part of what they might do.

In stress testing, start out with a light load and load the system along some dimension---such as input rate or input size---until you hit the wall. If the wall is too close to satisfy your needs, figure out which resource is the bottleneck (there is usually a dominant one.) Is it memory, processor, I/O, network bandwidth, or data contention? Then figure out how you can move the wall. Note that moving the wall, that is, increasing the maximum load the system can handle, might not help or might actually hurt the performance of a lightly loaded system. Usually performance under heavy load is more important than performance under a light load.

You may have to get visibility into several different dimensions to build up a mental model of it; no single technique is sufficient. For instance, logging often gives a good idea of the wall-clock time between two events in the system, but unless carefully constructed, doesn't give visibility into memory utilization or even data structure size. Similarly, in a modern system, a number of computers and many software systems may be cooperating. Particularly when you are hitting the wall (that is, the performance is non-linear in the size of the input) these other software systems may be a bottleneck. Visibility into these systems, even if only measuring the processor load on all participating machines, can be very helpful.

Knowing where the wall is is essential not only to moving the wall, but also to providing predictability so that the business can be managed effectively. How to Balance Brevity and Abstraction

Abstraction is key to programming. You should carefully choose how abstract you need to be. Beginning programmers in their enthusiasm often create more abstraction than is really useful. One sign of this is if you create classes that don't really contain any code and don't really do anything except serve to abstract something. The attraction of this is understandable but the value of code brevity must be measured against the value of abstraction. Occasionally, one sees a mistake made by enthusiastic idealists: at the start of the project a lot of classes are defined that seem wonderfully abstract and one may speculate that they will handle every eventuality that may arise. As the project progresses and fatigue sets in, the code itself becomes messy. Function bodies become longer than they should be. The empty classes are a burden to document that is ignored when under pressure. The final result would have been better if the energy spent on abstraction had been spent on keeping things short and simple. This is a form of speculative programming. I strongly recommend the article ``Succinctness is Power'' by Paul Graham[PGSite].

There is a certain dogma associated with useful techniques such as information hiding and object oriented programming that are sometimes taken too far. These techniques let one code abstractly and anticipate change. I personally think, however, that you should not produce much speculative code. For example, it is an accepted style to hide an integer variable on an object behind mutators and accessors, so that the variable itself is not exposed, only the little interface to it. This does allow the implementation of that variable to be changed without affecting the calling code, and is perhaps appropriate to a library writer who must publish a very stable API. But I don't think the benefit of this outweighs the cost of the wordiness of it when my team owns the calling code and hence can recode the caller as easily as the called. Four or five extra lines of code is a heavy price to pay for this speculative benefit.

Portability poses a similar problem. Should code be portable to a different computer, compiler, software system or platform, or simply easily ported? I think a non-portable, short-and-easily-ported piece of code is better than a long portable one. It is relatively easy and certainly a good idea to confine non-portable code to designated areas, such as a class that makes database queries that are specific to a given DBMS. How to Learn New Skills

Learning new skills, especially non-technical ones, is the greatest fun of all. Most companies would have better morale if they understood how much this motivates programmers.

Humans learn by doing. Book-reading and class-taking are useful. But could you have any respect for a programmer who had never written a program? To learn any skill, you have to put yourself in a forgiving position where you can exercise that skill. When learning a new programming language, try to do a small project it in before you have to do a large project. When learning to manage a software project, try to manage a small one first.

A good mentor is no replacement for doing things yourself, but is a lot better than a book. What can you offer a potential mentor in exchange for their knowledge? At a minimum, you should offer to study hard so their time won't be wasted.

Try to get your boss to let you have formal training, but understand that it often not much better than the same amount of time spent simply playing with the new skill you want to learn. It is, however, easier to ask for training than playtime in our imperfect world, even though a lot of formal training is just sleeping through lectures waiting for the dinner party.

If you lead people, understand how they learn and assist them by assigning them projects that are the right size and that exercise skills they are interested in. Don't forget that the most important skills for a programmer are not the technical ones. Give your people a chance to play and practice courage, honesty, and communication. Learn to Type

Learn to touch-type. This is an intermediate skill because writing code is so hard that the speed at which you can type is irrelevant and can't put much of a dent in the time it takes to write code, no matter how good you are. However, by the time you are an intermediate programmer you will probably spend a lot of time writing natural language to your colleagues and others. This is a fun test of your commitment; it takes dedicated time that is not much fun to learn something like that. Legend has it that when Michael Tiemann[2] was at MCC people would stand outside his door to listen to the hum generated by his keystrokes which were so rapid as to be indistinguishable. How to Do Integration Testing

Integration testing is the testing of the integration of various components that have been unit tested. Integration is expensive and it comes out in the testing. You must include time for this in your estimates and your schedule.

Ideally you should organize a project so that there is not a phase at the end where integration must explicitly take place. It is far better to gradually integrate things as they are completed over the course of the project. If it is unavoidable estimate it carefully. Communication Languages

There are some languages, that is, formally defined syntactic systems, that are not programming languages but communication languages---they are designed specifically to facillitate communication through standardization. In 2003 the most important of these are UML, XML, and SQL. You should have some familiarity with all of these so that you can communicate well and decide when to use them.

UML is a rich formal system for making drawings that describe designs. It's beauty lines in that is both visual and formal, capable of conveying a great deal of information if both the author and the audience know UML. You need to know about it because designs are sometimes communicated in it. There are very helpful tools for making UML drawings that look very professional. In a lot of cases UML is too formal, and I find myself using a simpler boxes and arrows style for design drawings. But I'm fairly sure UML is at least as good for you as studying Latin.

XML is a standard for defining new standards. It is not a solution to data interchange problems, though you sometimes see it presented as if it was. Rather, it is a welcome automation of the most boring part of data interchange, namely, structuring the representation into a linear sequence and parsing back into a structure. It provides some nice type- and correctness-checking, though again only a fraction of what you are likely to need in practicen.

SQL is a very powerful and rich data query and manipulation language that is not quite a programming language. It has many variations, typically quite product-dependent, which are less important than the standardized core. SQL is the lingua franca of relational databases. You may or may not work in any field that can benefit from an understanding of relational databases, but you should have a basic understanding of them and they syntax and meaning of SQL. Heavy Tools

As our technological culture progresses, software technology moves from inconceivable, to research, to new products, to standardized products, to widely available and inexpensive products. These heavy tools can pull great loads, but can be intimidating and require a large investment in understanding. The intermediate programmer has to know how to manage them and when they should be used or considered.

To my mind right some of the best heavy tools are:

*

Relational Databases, *

Full-text Search Engines, *

Math libraries, *

OpenGL?, *

XML parsers, and *

Spreadsheets.

How to analyze data --

Data analysis is a process in the early stages of software development, when you examine a business activity and find the requirements to convert it into a software application. This is a formal definition, which may lead you to believe that data analysis is an action that you should better leave to the systems analysts, while you, the programmer, should focus on coding what somebody else has designed. If we follow strictly the software engineering paradigm, it may be correct. Experienced programmers become designers and the sharpest designers become business analysts, thus being entitled to think about all the data requirements and give you a well defined task to carry out. This is not entirely accurate, because data is the core value of every programming activity. Whatever you do in your programs, you are either moving around or modifying data. The business analyst is analyzing the needs in a larger scale, and the software designer is further squeezing such scale so that, when the problem lands on your desk, it seems that all you need to do is to apply clever algorithms and start moving existing data.

Not so.

No matter at which stage you start looking at it, data is the main concern of a well designed application. If you look closely at how a business analyst gets the requirements out of the customer?s requests, you?ll realize that data plays a fundamental role. The analyst creates so called Data Flow Diagrams, where all data sources are identified and the flow of information is shaped. Having clearly defined which data should be part of the system, the designer will shape up the data sources, in terms of database relations, data exchange protocols, and file formats, so that the task is ready to be passed down to the programmer. However, the process is not over yet, because you ? the programmer ? even after this thorough process of data refinement, are required to analyze data to perform the task in the best possible way. The bottom line of your task is the core message of Niklaus Wirth, the father of several languages. ?Algorithms + Data Structures = Programs.? There is never an algorithm standing alone, doing something to itself. Every algorithm is supposed to do something to at least one piece of data.

Therefore, since algorithms don't spin their wheels in a vacuum, you need to analyze both the data that somebody else has identified for you and the data that is necessary to write down your code. A trivial example will make the matter clearer. You are implementing a search routine for a library. According to your specifications, the user can select books by a combination of genre, author, title, publisher, printing year, and number of pages. The ultimate goal of your routine is to produce a legal SQL statement to search the back-end database. Based on these requirements, you have several choices: check each control in turn, using a "switch" statement, or several "if" ones; make an array of data controls, checking each element to see if it is set; create (or use) an abstract control object from which inherit all your specific controls, and connect them to an event-driven engine. If your requirements include also tuning up the query performance, by making sure that the items are checked in a specific order, you may consider using a tree of components to build your SQL statement. As you can see, the choice of the algorithm depends on the data you decide to use, or to create. Such decisions can make all the difference between an efficient algorithm and a disastrous one. However, efficiency is not the only concern. You may use a dozen named variables in your code and make it as efficient as it can ever be. But such a piece of code might not be easily maintainable. Perhaps choosing an appropriate container for your variables could keep the same speed and in addition allow your colleagues to understand the code better when they look at it next year. Furthermore, choosing a well defined data structure may allow them to extend the functionality of your code without rewriting it. In the long run, your choices of data determines how long your code will survive after you are finished with it. Let me give you another example, just some more food for thought. Let's suppose that your task is to find all the words in a dictionary with more than three anagrams, where an anagram must be another word in the same dictionary. If you think of it as a computational task, you will end up with an endless effort, trying to work out all the combinations of each word and then comparing it to the other words in the list. However, if you analyze the data at hand, you'll realize that each word may be represented by a record containing the word itself and a sorted array of its letters as ID. Armed with such knowledge, finding anagrams means just sorting the list on the additional field and picking up the ones that share the same ID. The brute force algorithm may take several days to run, while the smart one is just a matter of a few seconds. Remember this example the next time you are facing an intractable problem. Team Skills How to Manage Development Time

To manage development time, maintain a concise and up-to-date project plan. A project plan is an estimate, a schedule, a set of milestones for marking progress, and an assignment of your team or your own time to each task on the estimate. It should also include other things you have to remember to do, such as meeting with the quality assurance people, preparing documentation, or ordering equipment. If you are on a team, the project plan should be a consensual agreement, both at the start and as you go.

The project plan exists to help make decisions, not to show how organized you are. If the project plan is either too long or not up-to-date, it will be useless for making decisions. In reality, these decisions are about individual persons. The plan and your judgment let you decide if you should shift tasks from one person to another. The milestones mark your progress. If you use a fancy project planning tool, do not be seduced into creating a Big Design Up Front (BDUF) for the project, but use it maintain concision and up-to-dateness.

If you miss a milestone, you should take immediate action such as informing your boss that the scheduled completion of that project has slipped by that amount. The estimate and schedule could never have been perfect to begin with; this creates the illusion that you might be able to make up the days you missed in the latter part of the project. You might. But it is just as likely that you have underestimated that part as that you have overestimated it. Therefore the scheduled completion of the project has already slipped, whether you like it or not.

Make sure you plan includes time for: internal team meetings, demos, documentation, scheduled periodic activities, integration testing, dealing with outsiders, sickness, vacations, maintenance of existing products, and maintenance of the development environment. The project plan can serve as a way to give outsiders or your boss a view into what you or your team is doing. For this reason it should be short and up-to-date. How to Manage Third-Party Software Risks

A project often depends on software produced by organizations that it does not control. There are great risks associated with third party software that must be recognized by everyone involved.

Never, ever, rest any hopes on vapor. Vapor is any alleged software that has been promised but is not yet available. This is the surest way to go out of business. It is unwise to be merely skeptical of a software company's promise to release a certain product with a certain feature at a certain date; it is far wiser to ignore it completely and forget you ever heard it. Never let it be written down in any documents used by your company.

If third-party software is not vapor, it is still risky, but at least it is a risk that can be tackled. If you are considering using third-party software, you should devote energy early on to evaluating it. People might not like to hear that it will take two weeks or two months to evaluate each of three products for suitability, but it has to be done as early as possible. The cost of integrating cannot be accurately estimated without a proper evaluation.

Understanding the suitability of existing third party software for a particular purpose is very tribal knowledge. It is very subjective and generally resides in experts. You can save a lot of time if you can find those experts. Often times a project will depend on a third-party software system so completely that if the integration fails the project will fail. Express risks like that clearly in writing in the schedule. Try to have a contingency plan, such as another system that can be used or the ability to write the functionality yourself if the risk can't be removed early. Never let a schedule depend on vapor. How to Manage Consultants

Use consultants, but don't rely on them. They are wonderful people and deserve a great deal of respect. Since they get to see a lot of different projects, they often know more about specific technologies and even programming techniques than you will. The best way to use them is as educators in-house that can teach by example.

However, they usually cannot become part of the team in the same sense that regular employees are, if only because you may not have enough time to learn their strengths and weaknesses. Their financial commitment is much lower. They can move more easily. They may have less to gain if the company does well. Some will be good, some will be average, and some will be bad, but hopefully your selection of consultants will not be as careful as your selection of employees, so you will get more bad ones.

If consultants are going to write code, you must review it carefully as you go along. You cannot get to the end of the a project with the risk of a large block of code that has not been reviewed. This is true of all team members, really, but you will usually have more knowledge of the team members closer to you. How to Communicate the Right Amount

Carefully consider the cost of a meeting; it costs its duration multiplied by the number of participants. Meetings are sometimes necessary, but smaller is usually better. The quality of communication in small meetings is better, and less time overall is wasted. If any one person is bored at a meeting take this as a sing, that the meeting should be smaller.

Everything possible should be done to encourage informal communication. More useful work is done during lunches with colleagues than during any other time. It is a shame that more companies do not recognize nor support this fact. How to Disagree Honestly and Get Away with It

Disagreement is a great opportunity to make a good decision, but it should be handled delicately. Hopefully you feel that you have expressed your thoughts adequately and been heard before the decision is made. In that case there is nothing more to say, and you should decide whether you will stand behind the decision even though you disagree with it. If you can support this decision even though you disagree, say so. This shows how valuable you are because you are independent and are not a yes-man, but respectful of the decision and a team player.

Sometimes a decision that you disagree with will be made when the decision makers did not have the full benefit of you opinion. You should then evaluate whether to raise the issue on the basis of the benefit to the company or tribe. If it is a small mistake in your opinion, it may not be worth reconsidering. If it is a large mistake in you opinion, then of course you must present an argument.

Usually, this is not a problem. In some stressful circumstances and with some personality types this can lead to things being taken personally. For instance, some very good programmers lack the confidence needed to challenge a decision even when they have good reason to believe it is wrong. In the worst of circumstances the decision maker is insecure and takes it as a personal challenge to their authority. It is best to remember that in such circumstances people react with the reptilian part of their brains. You should present your argument in private, and try to show how new knowledge changes the basis on which the decision was made.

Whether the decision is reversed or not, you must remember that you will never be able to say ‘I told you so!’ since the alternate decision was fully explored. Judgement How to Tradeoff Quality Against Development Time

Software development is always a compromise between what the project does and getting the project done. But you may be asked to tradeoff quality to speed the deployment of a project in a way that offends your engineering sensibilities or business sensibilities. For example, you may be asked to do something that is a poor software engineering practice and that will lead to a lot of maintenance problems.

If this happens your first responsibility is to inform your team and to clearly explain the cost of the decrease in quality. After all, your understanding of it should be much better than your boss's understanding. Make it clear what is being lost and what is being gained, and at what cost the lost ground will be regained in the next cycle. In this, the visibility provided by a good project plan should be helpful. If the quality tradeoff affects the quality assurance effort, point that out (both to your boss and quality assurance people). If the quality tradeoff will lead to more bugs being reported after the quality assurance period, point that out.

If she still insists you should try to isolate the shoddiness into particular components that you can plan to rewrite or improve in the next cycle. Explain this to your team so that they can plan for it.

NinjaProgrammer? at Slashdot sent in this gem:

Remember that a good design will be resillient against poor code implementations. If good interfaces and abstractions exist throughout the code, then the eventual rewrites will be far more painless. If it is hard to write clear code that is hard to fix, consider what is wrong with the core design that is causing this.

How to Manage Software System Dependence

Modern software systems tend to depend on a large number of components that may not be directly under your control. This increases productivity through synergy and reuse. However, each component brings with it some problems:

*

How will you fix bugs in the component? *

Does the component restrict you to particular hardware or software systems? *

What will you do if the component fails completely?

It is always best to encapsulate the component in some way so that it is isolated and so that it can be swapped out. If the component proves to be completely unworkable, you may be able to get a different one, but you may have to write your own. Encapsulation is not portability, but it makes porting easier, which is almost as good.

Having the source code for a component decreases the risk by a factor of four. With source code, you can evaluate it easier, debug it easier, find workarounds easier, and make fixes easier. If you make fixes, you should give them to the owner of the component and get the fixes incorporated into an official release; otherwise you will uncomfortably have to maintain an unofficial version . How to Decide if Software is Too Immature

Using software other people wrote is one of the most effective ways to quickly build a solid system. It should not be discouraged, but the risks associated with it must be examined. One of the biggest risks is the period of bugginess and near inoperability that is often associated with software before it matures, through usage, into a usable product. Before you consider integrating with a software system, whether created in house or by a third party, it is very important to consider if it is really mature enough to be used. Here are ten questions you should ask yourself about it:

Is it vapor? (Promises are very immature).

Is there an accessible body of lore about the software?

Are you the first user?

Is there a strong incentive for continuation?

Has it had a maintenance effort?

Will it survive defection of the current maintainers?

Is there a seasoned alternative at least half as good?

Is it known to your tribe or company?

Is it desirable to your tribe or company? 10.

Can you hire people to work on it even if it is bad?

A little consideration of these criteria demonstrates the great value of well-established free software and open-source software in reducing risk to the entrepreneur. How to Make a Buy vs. Build Decision

An entrepreneurial company or project that is trying to accomplish something with software has to constantly make so-called buy vs. build decisions. This turn of phrase is unfortunate in two ways: it seems to ignore open-source and free software which is not necessarily bought. Even more importantly, it should perhaps be called an obtain and integrate vs. build here and integrate decision because the cost of integration must be considered. This requires a great combination of business, management, and engineering savvy.

*

How well do your needs match those for which it was designed? *

What portion of what you buy will you need? *

What is the cost of evaluating the integration? *

What is the cost of integration? *

What is the cost of evaluating the integration? *

Will buying increase or decrease long term maintenance costs? *

Will building it put you in a business position you don't want to be in?

You should think twice before building something that is big enough to serve as the basis for an entire other business. Such ideas are often proposed by bright and optimistic people that will have a lot to contribute to your team. If their idea is compelling, you may wish to change your business plan; but do not invest in a solution bigger than your own business without conscious thought.

After considering these questions, you should perhaps prepare two draft project plans, one for building and one for buying. This will force you to consider the integration costs. You should also consider the long term maintenance costs of both solutions. To estimate the integration costs, you will have to do a thorough evaluation of the software before you buy it. If you can't evaluate it, you will assume an unreasonable risk in buying it and you should decide against buying that particular product. If there are several buy decisions under consideration, some energy will have to be spent evaluating each. How to Grow Professionally

Assume responsibility in excess of your authority. Play the role that you desire. Express appreciation for people's contribution to the success of the larger organization, as well as things as that help you personally.

If you want to become a team leader, instigate the formation of consensus. If you want to become a manager, take responsibility for the schedule. You can usually do this comfortably while working with a leader or a manager, since this frees them up to take greater responsibility. If that is too much to try, do it a little at a time.

Evaluate yourself. If you want to become a better programmer, ask someone you admire how you can become like them. You can also ask your boss, who will know less but have a greater impact on your career.

Plan ways to learn new skills, both the trivial technical kind, like learning a new software system, and the hard social kind, like writing well, by integrating them into your work. How to Evaluate Interviewees

Evaluating potential employees is not given the energy it deserves. A bad hire, like a bad marriage, is terrible. A significant portion of everyone's energy should be devoted to recruitment, though this is rarely done.

There are different interviewing styles. Some are torturous, designed to put the candidate under a great deal of stress. This serves a very valuable purpose of possibly revealing character flaws and weaknesses under stress. Candidates are no more honest with interviewers than they are with themselves, and the human capacity for self-deception is astonishing.

You should, at a minimum, give the candidate the equivalent of an oral examination on the technical skills for two hours. With practice, you will be able to quickly cover what they know and quickly retract from what they don't know to mark out the boundary. Interviewees will respect this. I have several times heard interviewees say that the quality of the examination was one of their motivations for choosing a company. Good people want to be hired for their skills, not where they worked last or what school they went to or some other inessential characteristic.

In doing this, you should also evaluate their ability to learn, which is far more important than what they know. You should also watch for the whiff of brimstone that is given off by difficult people. You may be able to recognize it by comparing notes after the interview, but in the heat of the interview it is hard to recognize. How well people communicate and work with people is more important than being up on the latest programming language.

A reader has had good luck using a ‘take-home’ test for interviewees. This has the advantage that can uncover the interviewee that can present themselves well but can't really code---and there are many such people. I personally have not tried this technique, but it sounds sensible.

Finally, interviewing is also a process of selling. You should be selling your company or project to the candidate. However, you are talking to a programmer, so don't try to color the truth. Start off with the bad stuff, then finish strong with the good stuff. How to Know When to Apply Fancy Computer Science

There is a body of knowledge about algorithms, data structures, mathematics, and other gee-whiz stuff that most programmers know about but rarely use. In practice, this wonderful stuff is too complicated and generally unnecessary. There is no point in improving an algorithm when most of your time is spent making inefficient database calls, for instance. An unfortunate amount of programming consists of getting systems to talk to each other and using very simple data structures to build a nice user interface.

When is high technology the appropriate technology? When should you crack a book to get something other than a run-of-the-mill algorithm? It is sometimes useful to do this but it should be evaluated carefully.

The three most important considerations for the potential computer science technique are:

*

Is it well encapsulated so that the risk to other systems is low and the overall increase in complexity and maintenance cost is low? *

Is the benefit startling (for example, a factor of two in a mature system or a factor of ten in a new system)? *

Will you be able to test and evaluate it effectively?

If a well-isolated algorithm that uses a slightly fancy algorithm can decrease hardware cost or increase performance by a factor of two across an entire system, then it would be criminal not to consider it. One of the keys to arguing for such an approach is to show that the risk is really quite low, since the proposed technology has probably been well studied, the only issue is the risk of integration. Here a programmer's experience and judgment can truly synergize with the fancy technology to make integration easy. How to Talk to Non-Engineers

Engineers and programmers in particular are generally recognized by popular culture as being different from other people. This implies that other people are different from us. This is worth bearing in mind when communicating with non-engineers; you should always understand the audience.

Non-engineers are smart, but not as grounded in creating technical things as we are. We make things. They sell things and handle things and count things and manage things, but they are not experts on making things. They are not as good at working together on teams as engineers are (there are no doubt exceptions.)[3] Their social skills are generally as good as or better than engineers in non-team environments, but their work does not always demand that they practice the kind of intimate, precise communication and careful subdivisions of tasks that we do.

Non-engineers may be too eager to please and they may be intimidated by you. Just like us, they may say ‘yes’ without really meaning it to please you or because they are a little scared of you, and then not stand behind their words.

Non-programmers can understand technical things but they do not have the thing that is so hard even for us---technical judgment. They do understand how technology works, but they cannot understand why a certain approach would take three months and another one three days. (After all, programmers are anecdotally horrible at this kind of estimation as well.) This represents a great opportunity to synergize with them.

When talking to your team you will, without thinking, use a sort of shorthand, an abbreviated language that is effective because you will have much shared experience about technology in general and your product in particular. It takes some effort not to use this shorthand with those that don't have that shared experience, especially when members of your own team are present. This vocabulary create a wall between you and those that do not share it, and, even worse, wastes their time.

With your team, the basic assumptions and goals do not need to be restated often, and most conversation focuses on the details. With outsiders, it must be the other way around. They may not understand things you take for granted. Since you take them for granted and don't repeat them, you can leave a conversation with an outsider thinking that you understand each other when really there is a large misunderstanding. You should assume that you will miscommunicate and watch carefully to find this miscommunication. Try to get them to summarize or paraphrase what you are saying to make sure they understand. If you have the opportunity to meet with them often, spend a little bit of time asking if you you are communicating effectively, and how you can do it better. If there is a problem in communication, seek to alter your own practices before becoming frustrated with theirs.

I love working with non-engineers. It provides great opportunities to learn and to teach. You can often lead by example, in terms of the clarity of your communication. Engineers are trained to bring order out of chaos, to bring clarity out of confusion, and non-engineers like this about us. Because we have technical judgment and can usually understand business issues, we can often find a simple solution to a problem.

Often non-engineers propose solutions that they think will make it easier on us out of kindness and a desire to do the right thing, when in fact a much better overall solution exists which can only be seen by synergizing the outsiders view with your technical judgment. I personally like Extreme Programming because it addresses this inefficiency; by marrying the estimation quickly to the idea, it makes it easier to find the idea that is the best combination of cost and benefit.

[1] “to hit” Chapter 4. Advanced

Table of Contents

Technological Judgment

How to Tell the Hard From the Impossible How to Utilize Embedded Languages Choosing Languages

Compromising Wisely

How to Fight Schedule Pressure How to Understand the User How to Get a Promotion

Serving Your Team

How to Develop Talent How to Choose What to Work On How to Get the Most From Your Teammates How to Divide Problems Up How to Handle Boring Tasks How to Gather Support for a Project How to Grow a System How to Communicate Well How to Tell People Things They Don't Want to Hear How to Deal with Managerial Myths How to Deal with Organizational Chaos

Technological Judgment How to Tell the Hard From the Impossible

It is our job to do the hard and discern the impossible. From the point of view of most working programmers, something is impossible if either it cannot be grown from a simple system or it cannot be estimated. By this definition what is called research is impossible. A large volume of mere work is hard, but not necessarily impossible.

The distinction is not facetious because you may very well be asked to do what is practically impossible, either from a scientific point of view or a software engineering point of view. It then becomes your job to help the entrepreneur find a reasonable solution which is merely hard and gets most of what they wanted. A solution is merely hard when it can be confidently scheduled and the risks are understood.

It is impossible to satisfy a vague requirement, such as ‘Build a system that will compute the most attractive hair style and color for any person.’ If the requirement can be made more crisp, it will often become merely hard, such as ‘Build a system to compute an attractive hair style and color for a person, allow them to preview it and make changes, and have the customer satisfaction based on the original styling be so great that we make a lot of money.’ If there is not crisp definition of success, you will not succeed. How to Utilize Embedded Languages

Embedding a programming language into a system has an almost erotic fascination to a programmer. It is one of the most creative acts that can be performed. It makes the system tremendously powerful. It allows you to exercise her most creative and Promethean skills. It makes the system into your friend.

The best text editors in the world all have embedded languages. This can be used to the extent that the intended audience can master the language. Of course, use of the language can be made optional, as it is in text editors, so that initiates can use it and no one else has to.

I and many other programmers have fallen into the trap of creating special purpose embedded languages. I fell into it twice. There already exist many languages designed specifically to be embedded languages. You should think twice before creating a new one.

The real question to ask oneself before embedding a language is: Does this work with or against the culture of my audience? If you intended audience is exclusively non-programmers, how will it help? If your intended audience is exclusively programmers, would they prefer an applications programmers interface (API)? And what language will it be? Programmers don't want to learn a new language that is narrowly used; but if it meshes with their culture they will not have to spend much time learning it. It is a joy to create a new language. But we should not let that blind us to the needs of the user. Unless you have some truly original needs and ideas, why not use an existing language so that you can leverage the familiarity users already have with it? Choosing Languages

The solitary programmer that loves his work (a hacker) can choose the best language for the task. Most working programmers have very little control of the language they will use. Generally, this issue is dictated by pointy-haired bosses who are making a political decision, rather than a technological decision, and lack the courage to promote an unconventional tool even when they know, often with firsthand knowledge, that the less accepted tool is best. In other cases the very real benefit of unity among the team, and to some extent with a larger community, precludes choice on the part of the individual. Often managers are driven by the need to be able to hire programmers with experience in a given language. No doubt they are serving what they perceive to be the best interests of the project or company, and must be respected for that. However, I personally believe this the most wasteful and erroneous common practice you are likely to encounter.

But of course, things are never one-dimensional. Even if a core language is mandated and beyond your control, it is often the case that tools and other programs can and should be written in a different language. If a language is to be embedded (and you should always consider it!) the choice of language will depend a lot on the culture of the users. One should take advantage of this to serve your company or project by using the best language for the job, and in so doing make work more interesting.

Programming languages should really be called notations in that learning one is not at all as difficult as learning a natural language. To beginners and to some outsiders ``learning a new language'' seems a daunting task; but after you have three under your belt it's really just a question of becoming familiar with the available libraries. One tends to think of a large system that has components in three or four languages as a messy hodgepodge; but I argue that such a system is in many cases stronger than a one-language system in several ways:

*

There is necessarily loose coupling between the components that are written in different notations (though maybe not clean interfaces), *

You can evolve to a new language/platform easily by rewriting each component individually, *

Its possible that some of the modules are actually up-to-date.

Some of these effects may only be psychological; but psychology matters. In the end the costs of language tyranny outweigh any advantage that it provides. Compromising Wisely How to Fight Schedule Pressure

Time-to-market pressure is the pressure to deliver a good product quickly. It is good because it reflects a financial reality, and is healthy up to a point. Schedule pressure is the pressure to deliver something faster than it can be delivered and it is wasteful, unhealthy, and all too common.

Schedule pressure exists for several reasons. The people who task programmers do not fully appreciate what a strong work ethic we have and how much fun it is to be a programmer. Perhaps because they project their own behavior onto us, they believe that asking for it sooner will make us work harder to get it there sooner. This is probably actually true, but the effect is very small, and the damage is very great. Additionally, they have no visibility into what it really takes to produce software. Not being able to see it, and not be able to create it themselves, the only thing they can do is see time-to-market pressure and fuss at programmers about it.

The key to fighting schedule pressure is simply to turn it into time-to-market pressure. The way to do this to give visibility into the relationship between the available labor and the product. Producing an honest, detailed, and most of all, understandable estimate of all the labor involved is the best way to do this. It has the added advantage of allowing good management decisions to be made about possible functionality tradeoffs.

The key insight that the estimate must make plain is that labor is an almost incompressible fluid. You can't pack more into a span of time anymore than you can pack more water into a container over and above that container's volume. In a sense, a programmer should never say ‘no’, but rather to say ‘What will you give up to get that thing you want?’ The effect of producing clear estimates will be to increase the respect for programmers. This is how other professionals behave. Programmers' hard work will be visible. Setting an unrealistic schedule will also be painfully obvious to everyone. Programmers cannot be hoodwinked. It is disrespectful and demoralizing to ask them to do something unrealistic. Extreme Programming amplifies this and builds a process around it; I hope that every reader will be lucky enough to use it. How to Understand the User

It is your duty to understand the user, and to help your boss understand the user. Because the user is not as intimately involved in the creation of your product as you are, they behave a little differently:

*

The user generally makes short pronouncements. *

The user has their own job; they will mainly think of small improvements in your product, not big improvements. *

The user can't have a vision that represents the complete body of your product users.

It is your duty to give them what they really want, not what they say they want. It is however, better to propose it to them and get them to agree that your proposal is what they really want before you begin, but they may not have the vision to do this. Your confidence in your own ideas about this should vary. You must guard against both arrogance and false modesty in terms of knowing what the customer really wants. Programmers are trained to design and create. Market researchers are trained to figure out what people want. These two kinds of people, or two modes of thought in the same person, working harmoniously together give the best chance of formulating the correct vision.

The more time you spend with users the better you will be able to understand what will really be successful. You should try to test your ideas against them as much as you can. You should eat and drink with them if you can.

Guy Kawasaki[Rules] has emphasized the importance of watching what your users do in addition to listening to them.

I believe contractors and consultants often have tremendous problems getting their clients to clarify in their own minds what they really want. If you intend to be a consultant, I suggest you choose your clients based on their clear-headedness as well as their pocketbooks. How to Get a Promotion

To be promoted to a role, act out that role first.

To get promoted to a title, find out what is expected of that title and do that.

To get a pay raise, negotiate armed with information.

If you feel like you are past due for a promotion, talk to your boss about it. Ask them explicitly what you need to do to get promoted, and try to do it. This sounds trite, but often times your perception of what you need to do will differ considerably from your boss's. Also this will pin your boss down in some ways.

Most programmers probably have an exaggerated sense of their relative abilities in some ways---after all, we can't all be in the top 10%! However, I have seem some people who were seriously unappreciated. One cannot expect everyone's evaluation to perfectly match reality at all times, but I think people are generally moderately fair, with one caveat: you cannot be appreciated without visibility into your work. Sometimes, do to happenstance or personal habits, someone will not be noticed much. Working from home a lot or being geographically separated from your team and boss makes this especially difficult. Serving Your Team How to Develop Talent

Nietschze exaggerated when he said[Stronger]:

What does not destroy me, makes me stronger.

Your greatest responsibility is to your team. You should know each of them well. You should stretch your team, but not overburden them. You should usually talk to them about the way they are being stretched. If they buy in to it, they will be well motivated. On each project, or every other project, try to stretch them in both a way that they suggest and a way that you think will be good for them. Stretch them not by giving them more work, but by giving them a new skill or better yet a new role to play on the team.

You should allow people (including yourself) to fail occasionally and should plan for some failure in your schedule. If there is never any failure, there can be no sense of adventure. If there are not occasional failures, you are not trying hard enough. When someone fails, you should be as gentle as you can with them while not treating them as though they had succeeded.

Try to get each team member to buy in and be well motivated. Ask each of them explicitly what they need to be well-motivated if they are not. You may have to leave them dissatisfied, but you should know what everybody desires.

You can't give up on someone who is intentionally not carrying their share of the load because of low morale or dissatisfaction and just let them be slack. You must try to get them well-motivated and productive. As long as you have the patience, keep this up. When your patience is exhausted, fire them. You cannot allow someone who is intentionally working below their level to remain on the team, since it is not fair to the team.

Make it clear to the strong members of your team that you think they are strong by saying so in public. Praise should be public and criticism private.

The strong members of the team will naturally have more difficult tasks than the weak members of the team. This is perfectly natural and nobody will be bothered by it as long as everyone works hard.

It is an odd fact that is not reflected in salaries that a good programmer is more productive than 10 bad programmers. This creates a strange situation. It will often be true that you could move faster if your weak programmers would just get out of the way. If you did this you would in fact make more progress in the short term. However, your tribe would lose some important benefits, namely the training of the weaker members, the spreading of tribal knowledge, and the ability to recover from the loss of the strong members. The strong must be gentle in this regard and consider the issue from all angles.

You can often give the stronger team members challenging, but carefully delineated, tasks. How to Choose What to Work On

You balance your personal needs against the needs of the team in choosing what aspect of a project to work on. You should do what you are best at, but try to find a way to stretch yourself not by taking on more work but by exercising a new skill. Leadership and communication skills are more important than technical skills. If you are very strong, take on the hardest or riskiest task, and do it as early as possible in the project to decrease risk. How to Get the Most From Your Teammates

To get the most from your teammates, develop a good team spirit and try to keep every individual both personally challenged and personally engaged.

To develop team spirit, corny stuff like logoized clothing and parties are good, but not as good as personal respect. If everyone respects everyone else, nobody will want to let anybody down. Team spirit is created when people make sacrifices for the team and think in terms of the good of the team before their own personal good. As a leader, you can't ask for more than you give yourself in this respect.

One of the keys to team leadership is to facilitate consensus so that everyone has buy in. This occasionally means allowing your teammates to be wrong. That is, if it does not harm the project too much, you must let some of your team do things their own way, based on consensus, even if you believe with great confidence it is the wrong thing to do. When this happens, don't agree, simply disagree openly and accept the consensus. Don't sound hurt, or like you're being forced into it, simply state that you disagree but think the consensus of the team is more important. This will often cause them to backtrack. Don't insist that they go through with their initial plan if they do backtrack.

If there is an individual who will not consent after you have discussed the issues from all appropriate sides, simply assert that you have to make a decision and that is what your decision is. If there is a way to judge if your decision will be wrong or if it is later shown to be wrong, switch as quickly as you can and recognize the persons who were right.

Ask your team, both as a group and individually, what they think would create team spirit and make for an effective team.

Praise frequently rather than lavishly. Especially praise those who disagree with you when they are praiseworthy. Praise in public and criticize in private; with one exception: sometimes growth or the correction of a fault can't be praised without drawing embarrassing attention to the original fault, so that growth should be praised in private. How to Divide Problems Up

It's fun to take a software project and divide it up into tasks that will be performed by individuals. This should be done early. Sometimes managers like to think that an estimate can be made without consideration of the individuals that will perform the work. This is impossible since the productivity of individuals varies so widely. Who has particular knowledge about a component also constantly changes and can have an order of magnitude effect on performance.

Just as a composer considers the timbre of the instrument that will play a part or the coach of an athletic team considers the strengths of each player, the experienced team leader will not usually be able to separate the division of the project into tasks from the team members to which they will be assigned. This is part of the reason that a high-performing team should not be broken up.

There is a certain danger in this given that people will become bored as they build upon their strengths and never improve their weaknesses or learn new skills. However, specialization is a very useful productivity tool when not overused. How to Handle Boring Tasks

Sometimes it is not possible to avoid boring tasks that are critical to the success of the company or the project. These tasks can really hurt the morale of those that have to do them. The best technique for dealing with this is to invoke or promote Larry Wall's programmer's virtue of Laziness. Try to find some way to get the computer to do the task for you or to help your teammates do this. Working for a week on a program to do a task that will take a week to do by hand has the great advantage of being more educational and sometimes more repeatable.

If all else fails, apologize to those who have to do the boring task, but under no circumstances allow them to do it alone. At a minimum assign a team of two to do the work and promote healthy teamwork to get the task done. How to Gather Support for a Project

To gather support for a project, create and communicate a vision that demonstrates real value to the organization as a whole. Attempt to let others share in your vision creation. This gives them a reason to support you and gives you the benefit of their ideas. Individually recruit key supporters for your project. Wherever possible, show, don't tell. If possible, construct a prototype or a mockup to demonstrate your ideas. A prototype is always powerful but in software it is far superior to any written description. How to Grow a System

The seed of a tree contains the idea of the adult but does not fully realize the form and potency of the adult. The embryo grows. It becomes larger. It looks more like the adult and has more of the uses. Eventually it bears fruit. Later, it dies and its body feeds other organisms.

We have the luxury of treating software like that. A bridge is not like that; there is never a baby bridge, but merely an unfinished bridge. Bridges are a lot simpler than software.

It is good to think of software as growing, because it allows us to make useful progress before we have a perfect mental image. We can get feedback from users and use that to correct the growth. Pruning off weak limbs is healthful.

The programmer must design a finished system that can be delivered and used. But the advanced programmer must do more. You must design a growth path that ends in the finished system. It is your job to take a germ of an idea and build a path that takes it as smoothly as possible into a useful artifact.

To do this, you must visualize the end result and communicate it in a way that the engineering team can get excited about. But you must also communicate to them a path that goes from wherever they are now to where they want to be with no large leaps. The tree must stay alive the whole time; it cannot be dead at one point and resurrected later.

This approach is captured in spiral development. Milestones that are never too far apart are used to mark progress along the path. In the ultra-competitive environment of business, it is best if the milestones can be released and make money as early as possible, even if they are far away from a well-designed endpoint. One of the programmer's jobs is to balance the immediate payoff against future payoff by wisely choosing a growth path expressed in milestones.

The advanced programmer has the triple responsibility of growing software, teams, and persons.

A reader, Rob Hafernik, sent in this comment on this section that I can do no better than to quote in full:

I think you under-emphasize the importance here. It's not just systems, but algorithms, user interfaces, data models, and so on. It's absolutely vital as you work on a large system to have measurable progress toward intermediate goals. Nothing is as bad as the special horror of getting down to the end and discovering that the whole thing just isn't going to work (look at the recent debacle of the Voter News System). I would even go further and state it as a law of nature: no large, complex system can be implemented from scratch, it can only be evolved from a simple system to a complex system in a series of intentional steps.

To which one can only reply Fiat lux! How to Communicate Well

To communicate well, you have to recognize how hard it is. It is a skill unto itself. It is made harder by the fact that the persons with whom you have to communicate are flawed. They do not work hard at understanding you. They speak poorly and write poorly. They are often overworked or bored, and, at a minimum, somewhat focused on their own work rather than the larger issues you may be addressing. One of the advantages of taking classes and practicing writing, public speaking, and listening is that if you become good at it you can more readily see where problems lie and how to correct them.

The programmer is a social animal whose survival depends on communication with her team. The advanced programmer is a social animal whose satisfaction depends on communication with people outside her team.

The programmer brings order out of chaos. One interesting way to do this is to initiate a proposal of some kind outside the team. This can be done in a strawman or white-paper format or just verbally. This leadership has the tremendous advantage of setting the terms of the debate. It also exposes you to criticism, and worse, rejection and neglect. The advanced programmer must be prepared to accept this, because she has a unique power and therefore a unique responsibility. Entrepreneurs who are not programmers need programmers to provide leadership in some ways. Programmers are the part of the bridge between ideas and reality that rests on reality.

I haven't mastered communicating well, but what I'm currently trying is what I think of a four-pronged approach: After I have my ideas in order and am fully prepared, I try to speak verbally, hand people a white-paper (on real paper, as well as electronically) show them a demo, and then patiently repeat this process. I think a lot of times we are not patient enough in this kind of difficult communication. You should not be disheartened if your ideas are not immediately accepted. If you have invested energy in there preparation, no one will think poorly of you for it. How to Tell People Things They Don't Want to Hear

You will often have to tell people things that will make them uncomfortable. Remember that you are doing this for a reason. Even if nothing can be done about the problem, you are telling them as early as possible so they will be well-informed.

The best way to tell someone about a problem is to offer a solution at the same time. The second best way is to appeal to them for help with the problem. If there is a danger that you won't be believed, you should gather some support for your assertion.

One of the most unpleasant and common things you will have to say is, ‘The schedule will have to slip.’ The conscientious programmer hates to say this, but must say it as early as possible. There is nothing worse than postponing action when a milestone slips, even if the only action is to inform everyone. In doing this, it is better to do it as a team, at least in spirit, if not physically. You will want your team's input on both where you stand and what can be done about it, and the team will have to face the consequences with you. How to Deal with Managerial Myths

The word myth sometimes means fiction. But it has a deeper connotation. It also means a story of religious significance that explains the universe and mankind's relationship to it. Managers tend to forget what they learned as programmers and believe in certain myths. It would be as rude and unsuccessful to try to convince them these myths are false as to try to disillusion a devoutly religious person of their beliefs. For that reason, you should recognize these beliefs as myths:

*

More documentation is always better. (They want it, but they don't want you to spend any time on it.) *

Programmers can be equated. (Programmers vary by an order of magnitude.) *

Resources can be added to a late project to speed it. (The cost of communication with the new persons is almost always more taxing than helpful.) *

It is possible to estimate software development reliably. (It is not even theoretically possible.) *

Programmers' productivity can be measured in terms of some simple metric, like lines of code. (If succinctness is power, lines of code are bad, not good.)

If you have an opportunity, you can try to explain these things, but don't feel bad if you have no success and don't damage your reputation by confronting these myths belligerently. Each of these myths reinforces the manager's idea that they have some actual control over what is going on. The truth is that managers facilitate if they are good, and impede if they are bad. How to Deal with Organizational Chaos

There are often brief periods of great organizational chaos, such as layoffs, buyouts, ipos, firings, new hirings, and so on. These are unsettling to everyone, but perhaps a little less unsettling to the programmer whose personal self-esteem is founded in capacity rather than in position. Organizational chaos is a great opportunity for programmers to exercise their magic power. I've saved this for last because it is a deep tribal secret. If you are not a programmer, please stop reading now.

Engineers have the power to create and sustain.

Non-engineers can order people around but, in a typical software company, can create and sustain nothing without engineers, just as engineers typically cannot sell a product or manage a business effectively. This power is proof against almost all of the problems associated with temporary organizational mayhem. When you have it you should ignore the chaos completely and carry on as if nothing is happening. You may, of course, get fired, but if that happens you can probably get a new job because of the magic power. More commonly, some stressed-out person who does not have the magic power will come into your cube and tell you to do something stupid. If you are really sure that it is stupid, it is best to smile and nod until they go away and then carry on doing what you know is best for the company.

If you are a leader, tell your people to do the same thing and tell them to ignore what anybody else tells them. This course of action is the best for you personally, and is the best for your company or project. Glossary

This is a glossary of terms as used in this essay. These do not necessarily have a standardized meaning to other people. Eric S. Raymond has compiled a massive and informative glossary[HackerDict] that rather surprisingly can pleasurably be read cover-to-cover once you can appreciate a fraction of it.

unk-unk

Slang for unknown-unknown. Problems that cannot presently even be conceptualized that will steal time away from the project and wreck the schedule. boss

The person or entity that gives you tasks. In some cases this may be the public at large. printlining

The insertion of statements into a program on a strictly temporary basis that output information about the execution of the program for the purpose of debugging. logging

The practice of writing a program so that it can produce a configurable output log describing its execution. divide and conquer

A technique of top-down design and, importantly, of debugging that is the subdivision of a problem or a mystery into progressively smaller problems or mysteries. vapor

Illusionary and often deceptive promises of software that is not yet for sale and, as often as not, will never materialize into anything solid. boss

The person who sets your tasks. In some cases, the user is the boss. tribe

The people with whom you share loyalty to a common goal. low-hanging fruit

Big improvements that cost little. Entrepreneur

The initiator of projects. garbage

Objects that are no longer needed that hold memory. busines

A group of people organized for making money. company

A group of people organized for making money. tribe

A group of people you share cultural affinity and loyalty with. scroll blindness

The effect of being unable to find information you need because it is buried in too much other, less interesting information. wall-clock

Actually time as measured by a clock on a wall, as opposed to CPU time. bottleneck

The most important limitation in the performance of a system. A constriction that limits performance. master

A unique piece of information from which all cached copies are derived that serves as the official definition of that data. heap allocated

Memory can be said to be heap allocated whenever the mechanism for freeing it is complicated. garbage

Allocated memory that no longer has any useful meaning. garbage collector

A system for recycling garbage. memory leak

The unwanted collection of references to objects that prevents garbage collection (or a bug in the garbage collector or memory management system!) that causes the program to gradually increase its memory demands over time. Extreme Programming

A style of programming emphasizing communication with the customer and automated testing. hitting the wall

To run out of a specific resource causing performance to degrade sharply rather than gradually. speculative programming

Producing a feature before it is really known if that feature will be useful. information hiding

A design principle that seeks to keep things independent and decoupled by using interfaces that expose as little information as possible. object-oriented programming

An programming style emphasizing the the management of state inside objects. communication languages

A language designed primarily for standardization rather than execution. boxes and arrows

A loose, informal style of making diagrams consiting of boxes and arrows drawn between those boxes to show the relationships. This contrast with formal diagram methodologies, such as UML. lingua franca

A language so popular as to be a de facto standard for its field, as French was for international diplomacy at one time. buy vs. build

An adjective describing a choice between spending money for software or writing it your self. mere work

Work that requires little creativity and entails little risk. Mere work can be estimated easily. programming notation

A synonym for programming language that emphasizes the mathematical nature of programming language and their relative simplicity compared to natural languages. strawman

A document meant to be the starting point of a technical discussion. A strawman may lead to a stickman, tinman, woodman, ironman, etc. wite-paper

An informative document that is often meant to explain or sell a product or idea to an audience different than the programmers of that product or idea.

Table of Contents

Bibliography/Websiteography

Bibliography/Websiteography Books

[Rules00] Guy Kawasaki, Michelle Moreno, and Gary Kawasaki. 2000. HarperBusiness?. Rules for Revolutionaries: The Capitalist Manifesto for Creating and Marketing New Products and Services.

[RDev96] Steve McConnell?. 1996. Microsoft Press. Redmond, Wash. Rapid Development: Taming Wild Software Schedules.

[CodeC93] Steve McConnell?. 1993. Microsoft Press. Redmond, Wash. Code Complete.

[XP99] Kent Beck. 1999. 0201616416. Addison-Wesley. Extreme Programming Explained: Embrace Change.

[PlanXP00] Kent Beck and Martin Fowler. 2000. 0201710919. Addison-Wesley. Planning Extreme Programming.

[Prag99] Andrew Hunt, David Thomas, and Ward Cunningham. 1999. 020161622X. Addison-Wesley. The Pragmatic Programmer: From Journeyman to Master.

[Stronger] Friedrich Nietzsche. 1889. Twilight of the Idols, "Maxims and Arrows", section 8.. Web Sites

[PGSite] Paul Graham. 2002. Articles on his website: http://www.paulgraham.com/articles.html. All of them, but especially "Beating the Averages".

[Hacker] Eric S. Raymond. 2003. How to Become a Hacker. http://www.catb.org/~esr/faqs/hacker-howto.html.

[HackDict] Eric S. Raymond. 2003. The New Hacker Dictionary. http://catb.org/esr/jargon/jargon.html.

[ExpCS] Edsger W. Dijkstra. 1986. How Experimental is Computing Science?. http://www.cs.utexas.edu/users/EWD/ewd09xx/EWD988a.PDF.

[Knife] Edsger W. Dijkstra. 1984. On a Cultural Gap. http://www.cs.utexas.edu/users/EWD/ewd09xx/EWD913.PDF . Appendix B. History (As Of February, 2003) Request for Feedback or Extension

Please send me any comments you may have on this essay. I consider all suggestions, many of which have already improved this essay.

I have placed this essay under the GNU Free Documentation License. This license is not specifically designed for essays. Essays are usually intended to be coherent and convincing arguments that are writtien from a single point of view in a single voice. I hope this essay is a short and pleasant read.

I also hope that it is instructive. Although not a textbook, it is broken into many small sections to which new sections can be freely added. If so inclined, you are encouraged to expand upon this essay as you see fit, subject to the provisions of the License.

It may be arrogance to imagine that this document is worthy of extension; but hope springs eternal. I would be joyous if it were extended in the following ways:

*

The addition of a comprehensive reading list to each section, *

The addition of more and better sections, *

Translation into other languages, even if only on a subsection-by-subsection basis, and/or *

Criticism or commentary in-lined into the text. *

The ability to build into different formats, such as palm formats and better HTML.

If you inform me of your work, I will consider it and may include it in subsequent versions that I produce, subject to the provisions of the License. You may of course produce your own versions of this document without my knowledge, as explained in the License.

Thank you.

Robert L. Read Original Version

The original version of this document was begun by Robert L. Read in the year 2000 and first published electronically at Samizdat Press(http://Samizdat.mines.edu) in 2002. It is dedicated to the programmers of Hire.com.

After this article was mentioned on Slashdot in 2003, about 75 people sent me email with suggestions and errata. I appreciate them all. There was a lot of duplication, but the following people either made major suggestions or were the first to find a bug that I fixed: Morgan McGuire?, David Mason, Tom Moertel, Ninja Programmer (145252) at Slashdot, Ben Vierck, Rob Hafernik, Mark Howe, Pieter Pareit, Brian Grayson, Zed A. Shaw, Steve Benz, Maksim Ioffe, Andrew Wu, David Jeschke, and Tom Corcoran.

Finally I would like to thank Christina Vallery, whose editing and proofreading greatly improved the second draft, and Wayne Allen, who encouraged me to initiate this. Original Author's Bio

Robert L. Read lives in Austin, Texas, with his wife and two children. He is currently a Principal Engineer at Hire.com, where he has worked for four years. Prior to that he founded 4R Technology, which made a scanner-based image analysis quality control tool for the paper industry.

Rob received a PhD? from the University of Texas at Austin in 1995 in Computer Science related to database theory. In 1987 he received a BA in Computer Science from Rice University. He has been a paid programmer since the age of 16. Appendix C. GNU Free Documentation License Version 1.2, November 2002

Table of Contents

PREAMBLE APPLICABILITY AND DEFINITIONS VERBATIM COPYING COPYING IN QUANTITY MODIFICATIONS COMBINING DOCUMENTS COLLECTIONS OF DOCUMENTS AGGREGATION WITH INDEPENDENT WORKS TRANSLATION TERMINATION FUTURE REVISIONS OF THIS LICENSE ADDENDUM: How to use this License for your documents

Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

PREAMBLE

The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque".

Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX? input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript? or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript? or PDF produced by some word processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.

A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition.

The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and you may publicly display copies. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

  1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
  2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
  3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
  4. Preserve all the copyright notices of the Document.
  5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
  6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
  7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.
  8. Include an unaltered copy of this License.
  9. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. 10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. 11. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. 12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. 13. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. 14. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. 15. Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.

You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this:

with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. Colophon

This work is licensed under the GNU Free Documentation License. It was originally written in LaTeX?, then ported to DocBook?. It is available in transparent copy in the DocBook?/XML format. A build system and special instructions on processing are part of the transparent copy package, though building from the source is system dependent. The source can be built into either HTML or PDF format, and extension to other formats should be possible and is encouraged.

The original version of this document was written by Robert L. Read without renumeration and dedicated to the programmers of Hire.com.

-- KevinJarnot - 26 May 2005

How to Detect Lies

from http://www.blifaloo.com/info/lies.php

Introduction to Detecting Lies:

The following techniques to telling if someone is lying are often used by police, and security experts. This knowledge is also useful for managers, employers, and for anyone to use in everyday situations where telling the truth from a lie can help prevent you from being a victim of fraud/scams and other deceptions.

Warning: Sometimes Ignorance is bliss; after gaining this knowledge, you may be hurt when it is obvious that someone is lying to you.

Signs of Deception:

Body Language of Lies:

  • A person who is lying to you will avoid making eye contact.

  • Physical expression will be limited and stiff, with few arm and hand movements. Hand, arm and leg movement are toward their own body the liar takes up less space.

  • Hands touching their face, throat & mouth. Touching or scratching the nose or behind their ear. Not likely to touch his chest/heart with an open hand.

Emotional Gestures & Contradiction

  • Timing and duration of emotional gestures and emotions are off a normal pace. The display of emotion is delayed, stays longer it would naturally, then stops suddenly.

  • Timing is off between emotions gestures/expressions and words. Example: Someone says "I love it!" when receiving a gift, and then smile after making that statement, rather then at the same time the statement is made.

  • Gestures/expressions don’t match the verbal statement, such as frowning when saying “I love you.”

  • Expressions are limited to mouth movements when someone is faking emotions (like happy, surprised, sad, awe), instead of the whole face. For example; when someone smiles naturally their whole face is involved: jaw/cheek movement, eyes and forehead push down, etc.

Interactions and Reactions

  • A guilty person gets defensive. An innocent person will often go on the offensive.

  • A liar is uncomfortable facing his questioner/accuser and may turn his head or body away.

  • A liar might unconsciously place objects (book, coffee cup, etc.) between themselves and you.

Verbal Context and Content

  • A liar will use your words to make answer a question. When asked, “Did you eat the last cookie?” The liar answers, “No, I did not eat the last cookie.”

  • A statement with a contraction is more likely to be truthful: “ I didn't do it” instead of “I did not do it”

  • Liars sometimes avoid "lying" by not making direct statements. They imply answers instead of denying something directly.

  • The guilty may speak more than natural, adding unessary details to convince you... they are not comfortable with silence or pauses in the conversation.

  • A liar may leave out pronouns and speak in a monotonous tone. When a truthful statement, is made the pronoun is empasized as much or more than the rest of the words in a statement.

  • Words may be garbled and spoken softly, and syntax and grammar may be off. In other words, his sentences will likely be muddled rather than emphasized.

Other signs of a lie:

  • If you believe someone is lying, then change subject of a conversation quickly, a liar follows along willingly and becomes more relaxed. The guilty wants the subject changed; an innocent person may be confuzed by the sudden change in topics and will want to back to the previous subject.

  • Using humor or sarcasm to avoid a subject.

-- KevinJarnot - 22 Jan 2005

How to Get the Perfect Shave

From http://www.msnbc.msn.com/id/6886845/

How to get that perfect shave Latest trends and products to avoid those nicks and cuts

By Corey Greenberg, Contributor, Weekend Today

Updated: 12:34 p.m. ET Jan. 30, 2005

Ever since prehistoric man first scraped a seashell across his cheek so prehistoric woman would let him dance cheek-to-cheek, shaving has been a part of the male experience. But even with today’s high-tech razors, lots of men still get nicks, cuts, and razor burn. Today’s Tech Editor Corey Greenberg is here with the latest trend in male grooming that promises a better shave by going back to the old school.

Q: What is the perfect shave and why do most guys get it so wrong?

A: The perfect shave is what all men strive for every morning when they bring their razor up their chin – an effortless shave that’s baby smooth, and without any of the usual skin irritation, redness, and that burning sensation most guys seem to feel is par for the course when it comes to shaving.

Why do so many guys find this so hard to achieve? Because proper shaving has become a lost art. Shaving is one of those glorious male traditions that used to be passed down from father to son, but somewhere along the line, when shaving became more about cheap, disposable razors than a nice, precision-made metal tool in your hand, it became a brainless routine to rush through in the morning without even thinking about it. A dull disposable razor dragged across a layer of foam or gel on your cheeks is a step backward from the past, not an improvement. Now that men of all ages are paying more attention to their appearance, it’s no wonder that the hottest trend right now in male grooming is a return to the traditional wet shave – and millions of men have been shocked to discover that the “old fashioned” method of shaving they thought went out with the Hula Hoop is actually the best quality shave you can get.

Q: What is “wetshaving” and how is it different from the way most men – and women – shave today?

A: Wetshaving is just what the term implies – keeping your face (or for women, their legs) wet with plenty of hot water before, and during, the entire shave. In fact, you should always shave after a hot shower, not before (if you need to shave without taking a shower, washing your face with hot water for a few minutes will suffice). With a layer of hot water between your skin and the lather, the blade skims the surface instead of dragging on it, which is the main cause of irritation, redness, and “shave bumps”.

Wetshaving gives you more effective shaves and better looking skin. The hot water opens the pores of your skin and relaxes your facial muscles, and it softens your whiskers for more effective cutting. Believe it or not, but your whiskers are tougher than the edge of a razor blade, and shaving “dry”, or mostly dry as with the vast majority of shaving creams, foams, and gels on the market, means you’re literally tugging on each and every hair on your face instead of neatly slicing it at the skin’s surface and moving on without irritating your skin. The key to proper wetshaving is keeping your face as wet as possible at all times during the shave. Even if you keep your current tools and routine, you’ll marvel at how much closer and more comfortable shaving can be when you keep your face hydrated at all times with lots of hot (not scalding) water.

Q: What are the basic tools you need for wetshaving?

A: The perfect shave has three ingredients: a good razor, a good brush, and glycerin-based shaving cream. But the biggest difference between wetshaving and the way most guys shave today is the use of a shaving brush. A good badger-hair shaving brush is the single most important ingredient in getting the perfect shave -- if you change no part of your shaving routine except to add a good shaving brush to the mix, you’ll be astounded at how much better and more enjoyable your shaves become.

Take it from a guy who used to use his fingers to smear cheap shaving gel on his face that smelled just like his deodorant – using a fine badger hair brush to brush high-end English shaving cream that smells like fresh-cut violets onto your face and neck isn’t just about treating yourself nicely after years of the ol’ slice’n’dice. It’s also the best possible way to prepare your skin and whiskers for the closest, most comfortable shave.

A shaving brush isn’t just a paint brush for your face. A good brush – and the best brushes are made of badger hair and start at $25 – absorbs hot water and then, after you dip the tip of the brush into your tub (yes, not a can, but a tub – I’ll explain later) the brush releases and mixes the hot water with the shaving cream as you skim the brush back and forth across your face and neck in and up-down motion. The combination of hot water mixing with the cream and getting beaten by the brush all over your face delivers a thicker, richer, more emollient lather that’s impossible to get with your fingers alone. A shaving brush also gently exfoliates, or removes the dead skin, from your face before shaving, which gets rid of anything coming between the blade and your whiskers. Finally, the up-down brushing lifts your whiskers and suspends them standing upright in the thick lather, which exposes the maximum whisker length to your blade as it skims along your face.

Genuine badger hair shaving brushes come in all sizes and hair types, costing anywhere from $25 for a basic pure-grade badger model to $550 for a monster-sized, high-end English hand-made job containing only the hair from the badger’s neck, which is said by some (though not by me) to be the finest and most rarefied expression of water-holding bristle known to man or badger.

Do you need a $550 shaving brush? Unless you’re Mr. Burns, the answer is no. I’ve gone through a lot of shaving brushes over the years, and as long as you stick with a genuine badger hair brush (cheaper brushes often use boar’s hair, which is much stiffer and pricklier than badger, and not nearly as comfortable on your face), the only things that matter are size and price. Bigger brushes hold more water and tend to make better lather faster and more easily, but really, the difference in lathering between a small $25 badger brush and that crazy $550 giant is negligible as long as you know what you’re doing, which means that if you can soak a brush in a sink full of hot water for a second or two, dab some shaving cream on the tips, and then swipe it up and down on your face and neck till you work up a thick, opaque layer of lather, you know what you’re doing. I recommend the English-made Vulfix brushes, which are much more reasonably priced than a lot of high-end British shaving brushes which don’t begin to approach the quality of the Vulfix models. They’re easily the best shaving brushes I’ve come across, despite being the most reasonably priced.

http://www.classicshaving.com/page/page/800550.htm

The next tool you need for wetshaving is a razor. And by razor, I mean whatever high-quality, NON-DISPOSABLE razor you feel most comfortable with. I know, I know, disposables are cool because that’s what they hand out in jail, but they’re extremely hard on your skin because the quality of the blades isn’t as good as a cartridge razor, or better yet, the kind of razor that serious wetshavers use: the classic double-edge safety razor!

A DE razor is the kind that takes a single, disposable razor blade, and it’s the same type of razor that your father, your grandfather, Cary Grant, Lee Marvin, JFK, and John Wayne used, and in the opinion of many shave-o-philes, the classic DE wipes the floor with any modern razor. I entirely concur – ever since I switched to using a DE razor, instead of a multi-blade cartridge razor, I get much closer and more comfortable shaves, my face doesn’t burn at all anymore, and all the red irritation on my neck I thought was there for good went away completely.

DE razors are also the best choice for African-American men, many of whom suffer from “shave bumps”, which occur when their tougher whiskers are cut too aggressively by modern mutli-blade razors, causing them to grow back underneath the skin and turn into ingrown hairs. Switching to a DE and using a shaving brush to exfoliate the skin and prep the whiskers is good for men of all races, but African-American men in particular find that shaving with a safety razor clears up their skin and makes shaving a pleasure again.

The men’s grooming boom has created a huge resurgence of interest in DE razors, and guys are snapping up vintage models on eBay for ten and twenty times what these razors sold for back in the 50s and 60s! But if you don’t want to shave with a razor that’s got a half-century under its belt, new safety razors are available that bring back the spirit of the classic Gillette adjustable DE razors, which many shaving connoisseurs consider the finest double-edge razor ever made. The German company Merkur offers a whole range of extremely high-quality, precision-made safety razors and platinum-coated blades, from a reissue of the 1904 Gillette DE to the super deluxe $120 Vision, the coolest, most futuristic-looking razor on the planet. The biggest bang for the buck is Merkur’s $27 HD “Hefty Classic” safety razor – it’s an excellent razor to start with if you’ve decided to take the DE plunge.

http://www.classicshaving.com/page/page/522941.htm

Once you’ve got a shaving brush, a razor, and some quality shaving cream, you’ll need a sink full of hot (not scalding) water. After you emerge from a nice, hot shower, fill the sink with hot water and let your shaving brush soak in the water as it fills the sink. Splash some more hot water on your face to keep it maximally wet. The key to wetshaving is keeping your face as hydrated with hot water at all times as possible.

Remove your brush from the water, hold it upside down until water stops pouring out of it, and then you’re ready to apply the cream. If you’ve got a tub of shaving cream, swirl the wet tips of your brush around in a circular motion on the surface of the cream until you get a small amount of visible white lather. You don’t need a lot of cream, but you you don’t want too little either. After your first few shaves, you’ll begin to get a feel for how much is just right.

Now you want to paint your face up and down, up and down all over the areas of your face and neck you’ll be shaving. Keep at it for a minute or so until you’ve got a thick, opaque layer of rich lather covering the shaving area. Then set your brush handle-down on the counter and pick up your razor.

You want to shave downward on your face and neck, WITH the direction your whiskers grow. At least for the first pass, a North-to-South stroke will get rid of most of your stubble without irritating your skin. If you want a closer shave, wet your face again, lather up again, and shave very lightly upward, against the grain, in a South-to-North direction. Most men’s skin is too sensitive to stand up to an against-the-grain shave without redness, razor burn, and even ingrown hairs, but if you can deal with it, go gently.

Once you’re done shaving, rinse your face with cold water to close the pores, thoroughly rinse your shaving brush of lather and shake it dry, and store it in your medicine cabinet on it’s handle, not lying down. This will let the bristles air-dry without damaging them, so your brush will last 20 years or more.

Pat, not rub, your face dry with a clean towel, and finish up with a good non-alcohol-based after-shave or moisturizer – I use and recommend Trumper’s “skin food”, but any good moisturizer will be better than that stinging alcohol-based stuff that we’ve all suffered with.

CAUTION: if you’ve been shaving with a disposable razor or one of the modern multi-blade cartridge systems like the Mach3, be aware that switching to a single-blade DE will require that you un-learn all the bad habits that modern razors are designed to let sleepy, lazy guys get away with. Mainly, that means slower, more careful strokes, and guiding the razor’s head over your skin WITHOUT PRESSING DOWN.

Let me say that again. WITHOUT PRESSING DOWN. AT ALL.

It’s really not a big deal – men were shaving this way for hundreds of years before plastic disposables and 2/3/4/?-blade razors were invented. Once you slow down and stop pressing the blade against your face so hard, you’ll find that not only do you get a closer, smoother shave, but all of that burning sensation and red marks all over your neck will start to go away immediately, and then disappear for good. Paradoxically, using a lighter touch doesn’t work nearly as well with modern multi-blade razors because they were designed to allow for the typical knucklehead who thinks the harder he rakes the razor across his cheeks the closer his shave will be. But with a DE, a lighter touch actually does result in a closer shave, and a much more comfortable and skin-friendly shave besides.

If you end up with a few nicks your first few shaves with a DE, don’t worry, it happens to all of us. It’s your face’s way of telling you to stop being a knucklehead. After a few shaves, you’ll figure it all out, and then you’ll wonder why you haven’t been shaving like this your whole life. This is one of those guy grooming secrets that separate the men from the boys.

Does the whole idea of using an old-school safety razor give you pause? Don’t worry – if you want to stick with your Mach3 or other cartridge razor, that’s okay. Just adding a shaving brush and quality cream to the mix will still give you a better shave, even if you use the same razor you were using before. But if you shave with disposables, you really should ditch them and at least start using a catridge razor. They’re not that much more expensive per shave, and they’re much better for your face.

A high-quality, glycerin-based shaving cream is the final ingredient in the perfect shave. If your shaving cream/gel comes in a can and costs less than a coffee at Starbucks, prepare to be astonished at what old-school European shaving cream lathers, shaves, and above all, smells like. Yes, I said smells like! If you’ve never lathered up in the morning with a fine English shaving cream that smells like fresh-cut violets, limes, or lavender, then you are truly missing out on one the great manly pleasures of all time.

The Europeans have been making this stuff for centuries, and they really do make the best shaving creams on the planet. At around $20 for a tub and $12 for a travel tube, they’re more expensive than the foams and gels at the drugstore, but since a little goes a long way when lathered with a shaving brush, these high-end creams last for many months of daily shaving.

I use and highly recommend Geo F. Trumper’s and Taylor of Old Bond Street’s shaving creams in both tubs for the bathroom and small tubes for travel. My personal favorites are Trumper’s violet and Taylor’s avocado, as well as their excellent lavender – these shaving creams will spoil you for anything else, and when lathered onto your face with hot water and a badger shaving brush, deliver the best skin protection and the finest shaves you’ve ever experienced. And the scents of these top-shelf creams will make you actually look forward to shaving, probably for the first time in your life.

I also use and recommend two inexpensive European creams which are also very popular with serious wetshavers. Portugal’s Musgo Real costs $8 a tube and has lanolin for an extremely moisturizing and comfortable shave. My favorite inexpensive shaving cream, though, is the legendary eucalytpus shaving cream from Italy called Proraso. This $7 wonder comes in a large, bright green toothpaste tube, and has been the best-selling shaving product in Italy since the 1940’s. Despite its budget price, Proraso actually shaves on a par with the fancy English creams, and it has the added benefit of eucalyptus oil, which gives your face an incredible cooling effect when you splash with cold water at the end of the shave. Like the Trumper and Taylor shaving creams, you can buy Proraso online, but if you have a local Italian deli or market, check there first, as many of them carry Proraso for their longtime customers. It doesn’t smell quite as intoxicating as Trumper’s violet, but it’s an outstanding shaving cream at an unbeatable price.

http://www.qedusa.com

Q: What about the good old-fashioned barber shop shave – do they still exist?

A: Yes! In fact, many real barbers (and I’m not talking about a kid who works in a salon that has a “Z” at the end of its name and plays loud dance music – I’m talking about a well-fed gentleman wearing a white smock, with a striped barber pole out in front of his shop) still offer their customers a shave with the most revered and yes, feared, of all shaving tools: the almighty straight razor, also known as a “cut throat”. The most serious at-home shavers gravitate toward the straight for its unequalled shave as well as its history and cool factor, but if you don’t feel like spending $100 for a cut throat and another $50 for a leather strop to keep it sharp, a barbershop shave is a great way to pamper yourself and get the shave of your life at the same time.

Michael Vozzelli is a fifth-generation barber who owns the Looks Good Barbershop in Cherry Hill, New Jersey, and this morning he’s demonstrating what a real barbershop shave is all about:

A barbershop shave starts with you lying back in a big leather barber chair while the barber wraps your face in hot towels for a few minutes to open up your pores and soften your whiskers. Then he lathers you up with a brush and cream, and masterfully guides the bare straight razor blade over your cheeks and chin so closely you can hear each whisker pop from across the room. After he’s done shaving you, he’ll wrap your face in more hot towels and then finish you off with some after-shave treatment and maybe even a wake-up nudge – contrary to what you might think, getting a really good barbershop shave is so relaxing for many men that they often fall asleep even as the straight razor is gliding over their Adam’s apple.

Women looking for the perfect Valentine’s Day gift for the men in their life should look no further than a gift certificate for a barbershop shave – really upscale barbershops even offer the gentleman’s trifecta of a shave, haircut, and shoeshine all in one visit. Hmm, who’s that a gift for, again?

http://www.looksgood.com

Q: And where can guys go if they’re interested in more information about wetshaving?

A: There are several wetshaving forums on the Net, but the most useful and informative for the first-timer is called Wetshavers. Some of the guys who post regularly have been wetshaving for over forty years, and they’re always happy to help a newbie and answer any questions he might have about products and technique. Shaving isn’t rocket science, but if you really want to shorten your learning curve with a safety razor or even a cut throat, Wetshavers’ archive is a great place to learn everything you need to know about getting the perfect shave.

http://groups.msn.com/WetShavers/

Two excellent online sources for razors, brushes and high-end shaving cream are Classic Shaving and QED. Both are smaller, Mom and Pop operations whose friendly service, expert advice, and unbeatable prices keep me coming back to order far more stuff than I’ll ever be able to use in one lifetime.

http://www.classicshaving.com

http://www.qedusa.com

Props: one large tabletop for the razors, brushes, creams, and accessories.

Personal mirror on a stand for the tabletop so I can see myself as I apply shaving cream and demo razors.

Two traditional leather old-timey barbershop chairs (barber will bring everything he needs except:

Lots of hot water

-- KevinJarnot - 04 Apr 2005

How to Make a VC Pitch in Powerpoint

From http://www.feld.com/blog/archives/2004/06/the_torturous_w.html

The Torturous World of Powerpoint

I've looked at thousands (tens of thousands?) presentations pitching new businesses since the mid 1990's. The vast majority of them suck. Unfortunately, it's not Powerpoint's fault (no - it wouldn't be better if Freelance has become the standard).

It's the content creators fault. Edward Tufte - a master of The Visual Display of Quantitative Information, thinks Powerpoint is evil and corrupts absolutely. Blogs like Beyond Bullets help reduce the corruption, but given that I'm trying to get a very specific set of information in a short period of time (usually 30 - 60 minutes), more specificity about what I think is "good" is probably helpful.

Several years ago, Chris Wand (one of the guys that works with me at Mobius Venture Capital) put together a list of questions that a pitch to a VC should address. The world would be a better place if all entreprenuers could automagically incorporate this outline into their pitches - at least to me.

Following are the questions to address.

1) WHAT IS YOUR VISION?

  • What is your big vision?
  • What problem are you solving and for whom?
  • Where do you want to be in the future?

2) WHAT IS YOUR MARKET OPPORTUNITY AND HOW BIG IS IT?

  • How big is the market opportunity you are pursuing and how fast is it growing?
  • How established (or nascent) is the market?
  • Do you have a credible claim on being one of the top two or three players in the market?

3) DESCRIBE YOUR PRODUCT/SERVICE

  • What is your product/service?
  • How does it solve your customers problem?
  • What is unique about your product/service?

4) WHO IS YOUR CUSTOMER?

  • Who are your existing customers?
  • Who is your target customer?
  • What defines an "ideal" customer prospect?
  • Who actually writes you the check?
  • Use specific customer examples where possible.

5) WHAT IS YOUR VALUE PROPOSITION?

  • What is your value proposition to the customer?
  • What kind of ROI can your customer expect by using buying your product/service?
  • What pain are you eliminating?
  • Are you selling vitamins, aspirin or antibiotics? (I.e. a luxury, a nice-to-have, or a need-to-have)

6) HOW ARE YOU SELLING?

  • What does the sales process look like and how long is the sales cycle?
  • How will you reach the target customer? What does it cost to "acquire" a customer?
  • What is your sales, marketing and distribution strategy?
  • What is the current sales pipeline?

7) HOW DO YOU ACQUIRE CUSTOMERS?

  • What is your cost to acquire a customer?
  • How will this acquisition cost change over time and why?
  • What is the lifetime value of a customer?

8) WHO IS YOUR MANAGEMENT TEAM?

  • Who is the management team?
  • What is their experience?
  • What pieces are missing and what is the plan for filling them?

9) WHAT IS YOUR REVENUE MODEL?

  • How do you make money?
  • What is your revenue model?
  • What is required to become profitable?

10) WHAT STAGE OF DEVELOPMENT ARE YOU AT?

  • What is your stage of development? Technology/product? Team? Financial metrics/revenue?
  • What has been the progress to date (make reality and future clear)?
  • What are your future milestones?

11) WHAT ARE YOUR PLANS FOR FUND RAISING?

  • What funds have already been raised?
  • How much money are you raising and at what valuation?
  • How will the money be spent?
  • How long will it last and where will the company "be" on its milestones progress at that time?
  • How much additional funding do you anticipate raising & when?

12) WHO IS YOUR COMPETITION?

  • Who is your existing & likely competition?
  • Who is adjacent to you (in the market) that could enter your market (and compete) or could be a co-opted partner?
  • What are their strengths/weaknesses?
  • Why are you different?

13) WHAT PARTNERSHIPS DO YOU HAVE?

  • Who are your key distribution and technology partners (current & future)?
  • How dependent are you on these partners?

14) HOW DO YOU FIT WITH THE PROSPECTIVE INVESTOR?

  • How does this fit w/ the investors portfolio and expertise?
  • What synergies, competition exist with the investors existing portfolio?

15) OTHER

  • What assumptions are key to the success of the business?
  • What "gotchas" could change the business overnight? New technologies, new market entrants, change in standards or regulations?
  • What are your company' weak links?

How to Make Windows XP Remote Desktop Multiuser

From http://riccardo.raneri.it/blog/eng/index.php/2006/04/24/windows-xp-multiuser-remote-desktop/:

An interesting feature, on Windows XP, is the ability to be remote controlled from a second PC: the so called “Remote Desktop Connection” can be used from a dial-up connection or in a local ethernet network.

XP (and Media Center Edition), differently than the Server versions of Windows, has a limit: a single PC can be controlled by a single “local” user (the “real” person on place), OR a single “remote” user. If someone logs into the computer from remote, the local user is disconnected. The following procedure deactivates this block and allows multiple persons to connect and to use a single computer from remote. Very useful, for example, if you’ve a very strong PC and you want your wife/friend/brother to use an old computer like a “terminal” to use applications on the new one, at the same time of you. Other application of the same technique: you’re at work and you want to connect to your home PC, without blocking your wife that is using the same computer to check email wink

UPDATE: it seems that XP is limited, also after this modification, to 3 concurrent users. So don’t waste time trying to raise the maximum number of connections over three (see step 5) because, at this time, I don’t think there’s a way to use the same XP PC with more than 3 persons at the same time (e.g. a local user and 2 remote users).

This procedure is an “hack”: do it at your own risk:

STEP 1

Start your Windows in Safe Mode (tap on F8 first of the Windows Loading Splash Screen); click on “My Computer” with right mouse button and choose “Properties”; go to “Remote” tab and uncheck “Allow users to connect remotely to this computer” (if it’s already unchecked, just do nothing); click OK.

STEP 2

Go to Start -> Control Panel; open “Administrative Tools” and then “Services”; double click “Terminal Services”, in the list; choose “Disabled” for “Startup Type” option; click OK.

STEP 3

Go to C:\windows\system32\dllcache; rename the termsrv.dll file to termsrv.original or another name you like; copy into the folder this unrestricted old version of termsrv.dll; go to C:\windows\system32 (the upper folder of the current one); do the same operation: rename termserv.dll also here, and put another copy of the file I linked above.

STEP 4

Click Start, then “Run…”, type “regedit” (without quotes) and press ENTER; navigate in the Windows Registry Tree to reach this path: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Licensing Core; click with right mouse button on blank space in the right part of the registry window, choose “New” > DWORD, name the new key “EnableConcurrentSessions” (without quotes), then edit it and set its value to 1; close the editor.

STEP 5

Click Start, then “Run…”, type “gpedit.msc” (without quotes) and press ENTER; open Computer Configuration > Administrative Templates > Windows Components > Terminal Services; double click “Limit number of connections”, choose “Enabled” and set the maximum number of concurrent connections you want to allow (2 or more), then Restart Windows in normal mode.

STEP 6

Go back to Remote tab of My Computer’s properties (see step 1) and activate “Allow users to connect remotely to this computer”; Go back to “Terminal services” in “Services” (see step 2) and set its “Startup type” to “Manual”

Now restart Windows. Your operating system should be ready to accept multiple remote desktop connections wink Remember that you’ve to prepare different Windows Users for every “phisical” user that want to connect to your desktop, to autenticate with separate logins/passwords. User accounts configuration is reachable in the control panel, and the list of users that can connect to the PC is editable in the remote tab of My computer.

-- KevinJarnot - 27 Apr 2006

How to Pitch an Idea

By Scott Berkun, February 2005

from http://www.uiweb.com/issues/issue38.htm

Coming up with good ideas is hard enough, but convincing others to do something with them is even harder. In many fields the task of bringing an idea to someone with the power to do something with it is called a pitch: software feature ideas, implementation strategies, movie screenplays, organizational changes, and business plans, are all pitched from one person to another. And although the fields or industries may differ, the basic skill of pitching ideas is largely the same. This essay provides a primer on idea pitches, and although most of my experience is in the tech-sector, I pitch to you that the advice here will be relevant to pitching business plans, yourself (e.g. job interviews), screenplays, or anything else.

The nature of ideas

Ideas demand change. By definition, the application of an idea means that something different will take place in the universe. Even if your idea is undeniably and wonderfully brilliant, it will force someone, somewhere to change how they do something. And since many people do not like change, and fear change, the qualities of your idea that you find so appealing may be precisely what make your idea so difficult for people to accept. Some individuals fear change so much that they structure their lives around avoiding it. (Know anyone exhibiting the curious behavior of being obviously miserable in their job, their city, their relationship, but still refusing to make changes?). So when your great idea comes into contact with a person who does not want change, you and your idea are at a disadvantage. Before you can begin the pitch, you have to make sure you’re talking to someone that’s interested in change, or has a clear need that your idea can satisfy.

Healthy and progressive organizations make change easier than stinky evil organizations do. Smart organizations (or managers) often depend on change. Leaders in these havens for smart people not only encourage positive change to happen, but expect people at all levels of their organization to push for it. It requires more work and maturity for these managers to make this kind of environment successful, but when they pull it off, smart people are systematically encouraged to be smart. Idea pitching happens all the time: in hallways, in the cafeteria, in meetings.

But since most of us don’t work in these kinds of places, the burden of pitching ideas falls heavily on our shoulders.

Step 0: Create and refine the idea

The classic mistake of would be idea pitchers is to pitch the idea well before its ready. When most people find an interesting idea, they’re quickly seduced by their egos into doing silly and non productive things, like annoying the pants off of everyone they come into contact with by telling them how amazing their new idea is. The thrill of being clever is so strong that they forget the fact that there are 100 interesting ideas bouncing around for every single truly good idea. By (my) definition, an interesting idea takes a novel or creative approach to doing something, whereas a good idea is not just creative, but actually improves on a meaningful quality or attribute, in a way that can be practically applied to the world (or the project). Good ideas include some thinking about execution and delivery. Saying “we should build cars that go 1000 mph and get 100mpg and easily fold to fit in your back pocket” or “We should make a children’s movie that is very funny and intelligent for parents and children, but also has a deep positive spiritual and moral message” count as interesting ideas. They’re good starts. But they won’t be good ideas, in the sense of pitch-work, until there’s both some logic for how to make it real within reasonable limitations, and some level of detail in how the convert the abstract idea (build a breakthrough automobile) into tangible plans (the trans warp drive I’ve designed improves gasoline efficiency tenfold).

So until the concepts and hard parts are fleshed out enough to demonstrate that the spirit of an idea is matched with specifics, the idea doesn’t have much of a foundation. People can dismiss it quickly just by asking 2 or 3 basic questions. Always remember that moving from an interesting but vague idea, to specific and actionable is the difficult part of creation and invention. (For example, there were lots of people with the idea for making light bulbs. Edison’s success was not in being the first one to conceive the idea, but in having the persistence and cunning to be the first person to solve many of the practicalities involved in engineering the idea).

Most of the time it’s not worth pitching an idea until you’re able to answer some of the basic pragmatic questions about it, such as: What problem does this solve? What evidence is there that the problem is real, and important enough to solve (or in the corporate world, solve profitably?) What are the toughest logistical challenges implied by the idea, and how will (or would) you solve them? Do you have a prototype, sample or demonstration of an implementation of the idea (aka proof of concept)? Why are you the right person to solve it? Why should this problem be solved now? Why should our organization solve this problem? These are all the kinds of questions someone that gets pitched to on a daily basis are likely to ask, and therefore, a good pitch-person will have done more than superficial thinking on their answers.

Step 1: What is the scope of the idea

The bigger the idea, the more involved the pitch. Big ideas require more change to take place on someone’s part, and all things being equal, this means the pitch must be more thorough (or your approach more bold & risky). The stakes are higher. To convince a CEO to start a new million dollar project will take more effort than convincing your best friend to loan you his pen. As a rough guide, here’s how to assess the scope of an idea, from narrow to grand:

  • Tiny tweak to something already in existence
  • New feature or enhancement to existing product / website / company
  • A major new area of an existing product / website / company
  • An entirely new, but small and simple, project
  • An entirely new, but large and possibly complex, project
  • An organizational, directional, or philosophical, change to an existing organization
  • A new organization
  • A new nation, planet or dimension of the universe (Sorry. But for how to pitch to the omnipotent forces that run the universe, you’ll have to look elsewhere).

When you’ve identified the scope of your idea, do some research on how others pitching ideas of similar scope went about it. You’re probably not the first person to pitch something of the scope you’re pitching, so go find out what other people did, and what kind of success they had. Learn from their mistakes. There are books on pitching business plans, movie scripts, and of course pitching yourself (job interviewing). Do your homework: know some of the basic strategies, or industry expectations for the kind of pitch your doing. In the software development world, talk to people who have pitched feature ideas in your organization, and see what you can learn.

Step 2: Who has the power to green light the idea

Make a list of the people that are potential recipients of your pitch. This could be your boss, your VP, another company, a bank, a publisher, who knows. Base this list on two criteria: who has the power needed to implement the idea, and who you might have access to. Here’s a rough guide, ordered from fantastic to depressing.

  • You have the power.
  • A peer in your organization has the power.
  • Your boss has the power
  • Someone above you in the organization
  • Someone you know in another organization.
  • Someone you don’t know and don’t have easy access to.
  • You have no idea.
  • You are paralyzed on a cold wet basement floor, and your annoying younger brother keeps poking you in the ribs with the pointy end of pencil. (See, it can always be worse).

If you have no idea who to pitch your idea to, ask around. There’s no sense developing your pitch if there’s no one to catch. If you don’t have access to the person with the power you need, make a list of who has access to them, working backwards until you can list people you actually know. You may need to work through this network of people, and make several pitches, to achieve the results you want. Just getting to the real pitch situation may take days, weeks or months or preparation and pitching to subordinates.

Step 3: Start with their perspective

Put your pitch aside. Imagine you have mind-melded with the person you are pitching to. How do they think about the world? What kinds of things are they probably interested in? What is their typical day like? How many unsolicited pitches do they receive a day? Consider how the person you’re trying to pitch views the world, and keep it in mind while developing your pitch. The better your pitch fits into their needs, perspectives, and desires, the greater your odds of being successful (or even being listened to). This doesn’t mean sell out, or only create ideas that you think a specific person will like. Instead this just means you have to be aware of how your perspective is different from theirs, and improve your ideas, and how you communicate them, based on that awareness. This may help you decide who to bring your pitch to: The most powerful person in the organization might share none of your philosophy, but the 3rd or 4th most powerful person might. The later is going to be a better place to start.

Step 4: The structure of the pitch

Always formulate 3 levels of depth to pitching your idea: 5 seconds, 30 seconds, 5 minutes (Credit to Ari Blenkhorn for this simple breakdown). The 5 second version, also known as the elevator pitch, is the most concise single sentence formulation of whatever your idea is. Refine, refine, refine your thinking until you can say something intelligent and interesting in a short sentence. “My idea? It’s a way to make car engines twice as efficient, and 5 times as powerful.” This can be done for any idea: never allow yourself to believe your thing is so complicated and amazing that it’s impossible to explain in a sentence. If you were to use this excuse on me, I’d tell you it means you don’t have enough perspective on how your idea fits into the world.

If you can get enough perspective of what you’re really doing, have a half-descent command of whatever language you’re using, and spend some time at it, you can develop a good 5 second pitch. Practice it on friends, peers, anyone, by doing the 5 second version, then answering their questions, and then asking them to help you refine the 5 second version again. (And if nothing else, the 5 second version comes in handy at parties, when you need to quickly explain what you’re doing without boring people to tears). As proof that 5 second explanations are possible, here's some diverse and complex ideas, and some simple 5 second explanations of them.

Discovering DNA “I’m researching how human cells reproduce”
Defragmenting hard drives "It makes computers run more efficiently"
Inventing light bulbs “It’s a way to make light from electricity.”
Writing a brilliant novel “The story explores twenty something angst in the digital age”
Improving anti-lock break algorithms “It improves automobile safety”

The 30 second and 5 minute versions should grow naturally out of the 5 second version. In 30 seconds, there’s enough time to talk about how you’ll achieve what you described in 5 seconds, or provide specifics of the 2 or 3 most significant things about how the effect described in the 5 second pitch will be achieved. Provide the next level of detail down, adding in just enough interesting detail that the listener can get a clearer picture of your idea, and gain a deeper and more nuanced understanding of what you’re proposing. If you can’t distill down what you’re doing in 5 and 30 second versions, don’t worry too much about the 5 minute version: odds are you won’t get many people to listen to you for that long.

However, since some people prefer to written proposals for pitches, this gives you a chance to deliver the 5, 30 and 5 minute versions all at once. In this case it’s often best to keep the same structure: start with your shortest pitch. Then provide the next level of detail down. And finally, the core of the paper or written proposal is a point by point detailing of how, giving the money & resources you need, you’ll achieve what you described in the 5 second pitch.

Also, remember that you won’t always have all of your materials with you when pitching ideas. At least briefly consider how you’d deal with the following different kinds of situations, and with the different asset limitations you’d have in each case.

  • The elevator – you.
  • The slow elevator - you, maybe something to show from your pockets.
  • The lunch - (you , maybe something to show, napkins to draw on, alcohol)
  • The conference room meeting - (laptop / slides / handout)
  • The executive review - (laptop / slides / handout / yes-men / splunge-men)

Sometimes it can be to your advantage to pitch with partner. Instead of one person pitching, you’ll be pitching as a team. If you can find a partner who compliments your skills, and who you can happily collaborate with, it’s probably worth it (And though your ego may try to convince you your better off alone, you probably aren’t). It doubles your network of organizational connections, and changes the psychology you’ll have when pitching. Instead of standing alone you’ll be a small team, and may even out number the person you’re pitching to.

Step 5: Test the pitch

The longer you spend with an idea, the more vulnerable you are to your own ego. Get out of your office / cubicle / apartment, and go find smart people you know to give you feedback. Ask them to pretend they are whoever it is you plan to pitch to (This can be fun if you can be specific, as in asking them to behave like Bill Gates, Donald Trump, or your own caricaturization of your boss). Then go through your pitch, responding to their questions (or ignoring their laughter). You won’t always get the feedback you want, but you’ll sharpen both your idea, and the way you talk about it. If the idea is amazing and groundbreaking and you’re afraid to run it by other people, find a close friend or parent and use them.

From your pitch tests, develop a list of questions you expect to be asked during the pitch, and be prepared to answer them.

Step 6: Deliver

Surprise - I don’t think there is a ton to know about actually pitching. If you’ve prepared well, have a good idea that you truly believe in, and manage not to get too nervous, most of the work is in the hand of whoever is listening to you. Be calm, be direct, state your case, and then listen. Like any kind of public speaking type situation, the more often you do it, the more comfortable it will become. But there isn’t much magic to the actual pitch. The only people that need to resort to tricks and manipulations are those that haven’t worked to understand their audience well, or don’t truly believe in what they are pitching.

The best delivery advice I can offer is to make sure you spend some time preparing for a positive response. What happens if they say “That’s an interesting idea. What do you want from me?” Do you want money? Other resources? A change in the project plan? A feature added to the feature list? Know what the sequence of steps are after they agree you have a good idea and be ready to ask for them. If there are other people involved who’s approval you’ll need, ask them to set up a meeting for you. If there is a form that needs to be filled out, make sure you have one with you.

Step 7: What to do when the pitch fails

When things don’t go well, your job is to harvest as much value from the attempt as possible. Always leave failed pitches with an understanding of what went wrong. Which points didn’t they agree with? Which of your assumptions did they refute? In many cases, you might learn there are criteria for green lighting ideas in your organization that you didn’t know about. It’s also possible they objected to something about your approach: maybe they didn’t appreciate that you accosted them outside their office, waving a stack of handouts in their face. If someone else in the room was there observing the pitch, ask for their feedback. In short, get as much learning out of completed pitches as you can. Recoup your investment in the failed pitch by mining any lessons out of it that you can apply next time.

From a tactical perspective: who else can you give this pitch to? Every organization has lots of people at peer levels of hierarchy. Would any of them be interested? Go back to your list from Step 2. Consider compromising on how much power is needed to make your idea happen, or how to split your idea into smaller ideas. Maybe focus on the first small piece of your larger idea, and revisit the rest after you’ve had some initial success.

Step 8: Do it yourself

In every creative industry you can find people rejected by the system who went off on their own, scrapped together their own resources, and made amazing things happen. Scrappy small budget films like Napoleon Dynamite, Clerks, Pi, happened only because a small group of people believed enough in their ideas to make the sacrifices, and do it themselves. Books and novels can be self published. Business can be started on small business loans or second mortgages. There is always a way to do it if you are sufficiently compelled by your ideas to take on risks, and make use of your own (unpaid) time.

If your idea is related to web or software, it’s entirely possible to make a prototype using Flash, HTML or other development tools. Go crack open some books, or if you have the money, go hire someone to make a demo out of your sketches and rough plans. Don’t ever allow yourself to believe that there is only one way to make ideas real: if you’re truly creative, you can apply the same talent used to come with your idea, to the problem of how to make your idea real.

References

Business plans that win, Pitching Hollywood - There are many books on developing business plans and pitching screenplays. I've yet to make any exceptional finds here, but these are decent places to start.

Changing Minds - Howard Gardner provides a science based framework for how an individual changes the minds of others. More about general science and psychology than a practical guide.

Influence: the psychology of persuasion - A classic book on the basic psychology of persuasion. More about advertising and environment than one on one pitch-work, this books offers a framework for how individuals are influenced by the context messages come in, and how the messages themselves are designed.

-- KevinJarnot - 08 Feb 2005

How to Sell Your Boss

From http://michaelhyatt.blogs.com/workingsmart/2004/11/how_to_sell_you.html


Selling your boss is critical to your success. If you can’t get your boss’s approval when you need it, you are not going to go very far in your career.

As the president of a company, I spend a good deal of time listening to proposals. Those doing the pitching usually need my approval to proceed with their project. Frankly, I never cease to be amazed at how poorly most people do in this kind of situation. Unfortunately, most of us never receive any formal training in this important skill. As a result, we flounder about, trying to figure out how to do it better.

In this article, I want to provide you with a few shortcuts, based on my 27–plus years in business. Hopefully, this will shorten your learning curve. As someone who is constantly pitched one thing or another, I have a lot of experience on the receiving end of proposals. I’ve seen the good, the bad, and the ugly. Here are six keys to getting your boss to say yes.

1. Meet your boss’s needs. This is the first and most important key to getting to “yes.” Everything else in this article is a footnote to this point.

Face it: no one cares about your needs. Okay, maybe I’m overstating it. A few people care. But, certainly everyone is more interested in having their needs met than yours. That’s just reality. The sooner you accept it, the faster you will get to “yes.”

For a salesperson to be effective, he must show the prospect how his product will solve the prospect’s problem or meet the prospect’s need. The same is true for the manager seeking approval on an important project. The boss doesn’t care how this will make your life easier. (Read that sentence again. Write it on a note card if necessary and memorize it.) He’s concerned about his needs and the needs of the company. So you must frame your proposal in these terms.

Most top managers have two basic needs: they want to grow their company and they want to increase their profitability. Whether they are a private company or a public one, this is the ticket to their personal success. If your proposal promises to do either, you’ve got their ear. If not, you’re likely dead before you start.

Middle managers have similar needs. However, in addition, they have a need to improve their image with their supervisor(s). They also have a need to meet their unit’s goals.

So before you schedule an appointment to pitch your proposal, you must answer the question, “How is my proposal going to help my boss achieve his goals?” If you can’t answer that question, you’re not ready to make the pitch.

For example, recently, one of my vice presidents wanted to add two graphic designers to his unit. With salary, benefits, and other overhead, this was going to cost about $100,000 a year. However, rather than start with this, he said, “Boss, great news. I think I figured out a way to save the company $100,000 a year.” For me, that translated into additional profit, so I was immediately interested. He then explained how we were already spending about $200,000 a year in outsourcing cover designs for a particular category of books. He convinced me that we could cut our expenses in half by bringing this function inside. He made it a “no-brainer” because he showed me how his proposal met my needs.

2. Pick your battles. I have a basic rule when it comes to pitching my boss: I don’t take a swing unless I am confident I will hit the ball. I would encourage you to do the same. Don’t make the pitch unless you intend to make the sale. Your credibility as a manager is at stake—with your boss, your peers, and your direct reports.

For example, I used to work for a guy that couldn’t sell his boss (now my boss) anything. This was unfortunate for me, because my proposals often exceeded his approval limit. He would then have to take my proposal to his boss for approval. Initially, he would enthusiastically approve my proposal and promise to get his boss’ approval. However, almost always, he would come back with his tail between his legs, mumbling about how unreasonable his boss was. Eventually, he started procrastinating going to his boss. He knew he would get rebuffed and didn’t want to appear powerless to me. As a result, my proposals would languish on his desk, waiting for an approval that would never come.

After about six months of this nonsense, his boss sensed my frustration. He then asked me to start reporting directly to him. Frankly, based on my then-boss’s comments about him, I dreaded this. He viewed him as an unreasonable, capricious tyrant. However, I found him to be exactly the opposite. He was a great listener and sincerely wanted to help me. He made quick decisions and never impeded my progress.

I’ve now been working for him three years. I feel the same way about him now that I felt at the beginning. My ability to get quick decisions enhances my credibility, both with him and my direct reports. They know they can count on me to get the approvals they need to accomplish their goals—and mine—in a timely manner.

Again, the key is here is to pick your battles and prepare thoroughly. Eventually, you will develop a reputation for getting things done. This reputation will actually make it possible to pre-sell your boss before you ever say one word. He’ll be thinking, If John is recommending this, it is worth seriously consideration. I can be confident he has thought it through and asked the tough questions.

3. Do your homework. I’ve already mentioned this in passing, but it is worth repeating here and amplifying. In my experience, this is the number one reason why people don’t get to “yes.” They simply haven’t thought the proposal through. As a result, it is full of holes. Each of these provides an easy out for the boss and a quick “no” for you.

A couple of years ago, I developed a Recommendation Briefing Form (a.k.a. “RBF”) as a means of summarizing my proposal and making sure I covered the key points—briefly and in order. (Click here to download a zipped copy.) The form contains five major headings. Here’s how to use them:

  • Recommendation. Start with the conclusion. It is so much easier for me—and probably your boss—to concentrate if he knows what you want up front. This keeps me from constantly being distracted with thoughts like, I wonder where he is going with this? What does he want? Get to the point! etc. If you start with the conclusion, your boss can relax and listen to the rest of your proposal. Also, be sure to state precisely what you are recommending. Don’t beat around the bush. Be brief—two sentences at the most. And don’t include more than one recommendation per form. Keep it simple.

  • Background. Usually, your boss will need a little context for your recommendation. Give him the background. But again, be brief. Only provide the background necessary for him to make an intelligent decision. A paragraph should be sufficient. Stay focused and keep moving.

  • Rationale. List all the reasons why your boss should accept your recommendation and approve your proposal. Shoot for five to seven reasons. (If you come up with more, select the most important ones and delete the others. You want to convince him, not bore him!) In addition to including why he should approve your recommendation, also articulate the consequences of not approving it. Once you have your list, prioritize it. Start with your most important reason and then work down the list, listing the next most important next, etc.

  • Timetable. Indicate when you will implement the proposal if approved. If the rollout will be staged (i.e., done in segments), briefly outline the key milestones.

  • Financial Impact. State this negatively (i.e., the cost or investment) and positively (i.e., the that is, additional sales, return on investment, etc.). Make it clear, and shoot straight. Don’t downplay the cost or hype the benefits. You want to develop a reputation of being conservative, but not overly so. Regardless, you always want to under-promise and over-deliver.

Keep in mind that the entire RBF should be no more than two pages long. Shorter is better. I have seen very effective RBFs that are only a page long. If you have more information—and I often do—bring it along as backup, in order to answer specific questions. Note: make sure all the documents you intend to distribute are neat and professional.

4. “Bullet proof” your proposal. This is where the battle is won or lost. Unfortunately, it’s a step that most people skip—to their own detriment. Spending 30 minutes working on this is the best investment you could make.

First, think of every question your boss could possibly ask. To prime the pump, use the “who, what, why, when, where, and how” helpers. Make sure each key question is answered in your RBF. Don’t risk getting a “no” because you haven’t carefully thought through the proposal.

Next, on a separate sheet of paper, list every objection to your recommendation you can think of. Play devil’s advocate. However, don’t try to answer the objection yet. First, get them on paper. Once you’ve done that, go back and write out talking points (i.e., bullets) for overcoming each objection. I type this up on a separate document that I take to the meeting with my boss. I have it in my folder for reference.

5. Make the pitch. Schedule a time to make the pitch. Pick a time when your boss is likely to be the most receptive. Has it been a bad month? Don’t schedule an appointment right after he’s likely to get the news. Is he more alert in the morning or the afternoon? Use some common sense and try to schedule the meeting when you have the best chance of success.

Now go in and make the pitch. I usually just slide the RBF across the table and jump in. I literally walk through the document one section at a time. Here are a few pointers to keep in mind while making your presentation.

  • Maintain eye contact. Yes, I know. I said that I walk through the document. However, I don’t read it. The document is intended to be a “talking points” list rather than a narrative. You should be familiar enough with your recommendation that you can stay focused on your boss—and his reactions—rather than the RBF.

  • Stay alert to the signals. This is “Selling 101.” Does your boss appear bored? Pick up the pace. Does he have a question? Stop talking and let him ask. (Hint: If your boss engages you in a discussion, this is a good thing! It means he is interested.) Is he distracted? Let him get refocused or reschedule the appointment. The last thing you want to do is plow ahead, oblivious to the reactions of the very person you’re trying to persuade.

  • Re-state the recommendation. When you get to the end of your presentation, restate your recommendation and ask for a decision. Then—and this is critical—stop talking. Give your boss a chance to say, “yes.” This may make you feel uncomfortable, but, trust me, you will decrease your chances of success if you keep talking. Sometimes, your boss just needs to sit there and absorb your pitch. Sometimes, he may sit quietly to see what other information you may volunteer. Regardless, resist the temptation to fill the vacuum with words.

  • Know when you are done. Once your boss approves your recommendation, it’s once again time to shut up. My Dad taught me this early in my career, and it has served me well ever since. I can’t tell you how many times I’ve seen a person in authority give his approval and then watch the presenter proceed to unsell the sale. If possible, when the boss says, “yes,” thank him for his decision, collect your belongings, and leave the room. If you can’t leave, then at least move to the next agenda item or change the subject.

6. Accept responsibility for the outcome. When I was further down the food chain, I used to hear my peers constantly complain about how unreasonable their boss was or how bureaucratic the company was. Blah, blah, blah. They had a thousand and one excuses for why they didn’t “make the sale.” Few of them were willing to accept the fact that their proposal just wasn’t that compelling. Their presentation skills sucked, and it was easier for them to blame someone else rather than accept responsibility for the outcome. As a result, they missed the opportunity to improve their skills.

If your boss says, “no,” go back to your desk and engage in a little post mortem analysis. What went wrong? What could have been stronger? Where were you unprepared? How can you do this better next time? Accept full responsibility for the outcome, and you will gradually get better at this critical skill. Not only will you become better at getting to “yes,” you will also find yourself moving along faster in your career.

-- KevinJarnot - 07 Jan 2005

How to Study

By William J. Rapaport, Department of Computer Science and Engineering, Department of Philosophy and Center for Cognitive Science, State University of New York at Buffalo

See http://www.cse.buffalo.edu/~rapaport/howtostudy.html or local

-- KevinJarnot - 08 Feb 2005

IT Contracts

Articles

-- KevinJarnot - 12 Jan 2005

Steroid Inhalers for Asthma Can Weaken Bones

By Elaine Zablocki WebMD? Medical News

April 21, 2000 -- A steroid inhaler may be your best friend if you have asthma. It's easy to use and generally has fewer side effects than steroid pills. But a new study shows that high doses of inhaled steroids for asthma may in fact lead to weak and thinning bones -- a side effect that, until now, was primarily associated with steroid pills.

The study also suggests that the more asthma patients used inhaled steroids, the weaker their bones became.

Inhaled steroids are frequently used to decrease inflammation and airway blockage and are one of the main treatments used for asthma. Doctors and patients generally prefer them to steroid pills because steroid pills have more side effects -- one of the most troubling being bone loss that can lead to osteoporosis.

However, physicians and researchers were not sure if enough inhaled steroids got into the bloodstream to cause bone loss. So this study looked at people who had been on inhaled steroids for asthma for about six years and tested their bone density, a sign of bone strength.

This study points out that another risk of using inhaled steroids for asthma may indeed be bone loss, according to Norman H. Edelman, MD, who was not involved in the study. He says that doctors and patients have to weigh the risks of asthma against osteoporosis when making a decision about treatment with inhaled steroids. Edelman is the dean of the School of Medicine at the State University of New York at Stony Brook and a scientific consultant to the American Lung Association.

The researchers found that the patients with asthma taking high doses of inhaled steroids had a significant loss in bone density. The three inhaled steroids used in the study were Beclovent, Flovent, and Pulmicort. Other steroid inhalers used in the U.S. that were not included in the study are Aerobid and Azmacort. These results are published in the April 22 issue of the medical journal The Lancet.

You should tell your doctor about this new study, Edelman says. "Ask your physician what you can do to protect your bones. Also ask what they are doing to ensure that your risk of bone density loss is as low as possible."

"The key question is, how do you get the benefit of inhaled steroids with the least amount of risk?" says Thomas Plaut, MD, who reviewed the study for WebMD?. "Not everybody needs them. Someone who does a good job of cleaning up their environment and eliminating allergens such as dust, pollen, and animal dander can cut their need for inhaled steroids by up to 50%."

He says people with mild asthma -- about 60% of all asthma patients -- can often get relief by using instead a medication that doesn't contain steroids to relieve inflammation, such as Accolate, Singulair, or Tilade. However, for many patients, particularly those with moderate or severe asthma, that will not be sufficient. Plaut is the author of Dr. Tom Plaut's Asthma Guide. He is in private practice in Amherst, Mass., and acts as a consultant on asthma issues to health plans and state and municipal health departments.

"Our study suggests that ... patients should therefore take the lowest dose that adequately controls their asthma," the authors write.

Plaut also strongly recommends the use of a spacer, which is a device that attaches to the inhaler. A spacer catches the large particles of steroids and lets you breathe in only the small particles. The large particles are what lead to most of the side effects, but do not add any benefit, Plaut says. "Be sure to rinse your mouth and spit out so you don't swallow any of the medication. Inhaled steroids in the mouth promote yeast infections there and also disperse steroids throughout the body."

Patients with asthma should be aware that they are at increased risk for osteoporosis and therefore take the steps that are generally advised to build and maintain strong bones. Plaut advises all his female asthma patients to take 1,500 milligrams of calcium and 400 units of vitamin D every day. Edelman notes that the need to build and maintain strong bones is yet another reason, in addition to its heart and muscle benefits, to recommend exercise for asthma patients.

"However, since exercise itself can sometimes cause airway narrowing, patients with asthma should engage in the right kind of exercise: walking rather than sprinting. You don't want intensely aerobic games like soccer. Swimming is particularly beneficial for asthmatics, because it takes place in a humid environment, so the airways don't dry out."

For more information about asthma, please go to our Condition Center.

Vital Information:

a.. Researchers report patients who took high doses of inhaled steroids for their asthma may be weakening and thinning their bones. b.. Observers note the study demonstrates that loss of bone density is a risk that needs to be weighed before patients start using inhaled steroids to control asthma. Patients also should be talking with their doctors about protecting their bones. c.. The authors stress that patients should take the lowest dose that controls their asthma. Another doctor urges patients to use a spacer, which attaches to an inhaler and catches the large steroid particles so only the smaller ones are inhaled. Large particles don't add benefit to therapy and tend to cause side effects.

-- KevinJarnot - 06 Feb 2005

Internet History and Folklore

-- KevinJarnot - 10 Dec 2004

Interstate Route Numbering

From http://www.fhwa.dot.gov/programadmin/interstate.html

The Interstate route marker is a red, white, and blue shield, carrying the word "Interstate", the State name, and the route number. Officials of AASHTO developed the procedure for numbering the routes. Major Interstate routes are designated by one- or two-digit numbers. Routes with odd numbers run north and south, while even numbered run east and west. For north-south routes, the lowest numbers begin in the west, while the lowest numbered east-west routes are in the south. By this method, Interstate Route 5 (I-5) runs north-south along the west coast, while I-10 lies east-west along the southern border.

In two cases, a major route has two parallel or diverging branches. In those cases, each branch is given the designation of the main route, followed by a letter indicating a cardinal direction of travel (east, west, etc). In Texas, for example, I-35 splits at Hillsboro, with I-35E going through Dallas, while I-35W goes through Fort Worth. The two branches merge at Denton to reform I-35. A similar situation exists along I-35 in the Minneapolis-St. Paul area of Minnesota.

The major route numbers generally traverse urban areas on the path of the major traffic stream. Generally, this major traffic stream will be the shortest and most direct line of travel. Connecting Interstate routes and full or partial circumferential beltways around or within urban areas carry a three-digit number. These routes are designated with the number of the main route and an even-numbered prefix. Supplemental radial and spur routes, connecting with the main route at one end, also carry a three-digit number, using the number of the main route with an odd-number prefix.

To prevent duplication within a State, a progression of prefixes is used for the three-digit numbers. For example, if I-80 runs through three cities in a State, circumferential routes around these cities would be numbered as I-280, I-480, and I-680. The same system would be used for spur routes into the three cities, with routes being numbered I-180, I-380, and I-580, respectively. This system is not carried across State lines. As a result, several cities in different States along I-80 may each have circumferential beltways numbered as I-280 or spur routes numbered as I-180.

Interstate Exit Numbers

The States typically use one of two methods of numbering the Interstate interchange exits.

  • The Consecutive numbering system -- Starting at the most westerly or southerly point on each Interstate route, interchanges are numbered consecutively. Thus the first interchange becomes Interchange #1. Each succeeding interchange is numbered consecutively as #2, 3, 4, etc.

  • The Milepost numbering system -- All Interstate routes are mileposted beginning at the most westerly or southerly point. The beginning point is milepost '0'. If the first interchange on the route is located between milepost 4.0 and 5.0, it is numbered as Interchange #4. The next interchange, if located at milepost 8.7, would be numbered as Interchange #8, etc. With this system the motorist can easily determine the location and distance to a desired interchange.

-- KevinJarnot - 22 Jan 2005

Playful Parenting (An interview with Dr. Lawrence Cohen, PH.D.)

By Elizabeth Shaffer

Playful parenting – what a concept. Have fun with your kids? Who would have thought. As a psychologist specializing in play therapy, Dr. Lawrence J. Cohen, believes that play is one of the best ways to connect with your child. “Play is a bridge back to reconnection,” states Cohen. He says that too often we as adults have a need for perfection in our daily lives. “Let things slide,” advises Cohen when it comes to the stresses of life and he suggests that we get down on the floor and play with our kids.

Cohen states that if we are open to exploring our child’s world and are “ready to play,” both will benefit from the connections that are built. Cohen argues that too often adults will become bored with “child’s play.” By expressing boredom with your child’s choice of play, you are sending a message that the game is “stupid” says Cohen. “Throw yourself enthusiastically into the game your bored with,” suggests Cohen, “it becomes more exciting and creative.”

“Always think about reconnection,” Cohen advises. “Have a goal in mind first…By joining in on your child’s play, your are sending a message.” Cohen says that by taking the time to get down on the floor and play with your child you both benefit. They feel that you value what is important to them and you get to connect with your child in an intimate way.

“A toy a child likes is a great way to connect,” states Cohen. He says that most misbehaviours are from a lack of connecting and by reconnecting with your child through play instead of staying on the sidelines you remove the power struggle and communicate.

So, what kind of toy would an expert in play recommend? “It should be better than the box it came in,” states Cohen. Most of us have experienced that feeling; our young child has more fun with the box a toy came in that the toy itself. Cohen says that the reason this often happens is because the box can be anything. Children can use their imagination with a box as opposed to a toy with only one specific purpose. “Toys should be open ended,” says Cohen. These kinds of toys allow children to use their imagination and get real play value from them. When asked to recommend a toy, Cohen enthusiastically spoke about Lego’s new line of preschool toys, Explore, in particular, Theatre Stories. This toy has all of the qualities a good toy should. It is open ended, allows children to lead the play and triggers the imagination. “Children are into fantasy, creativity and fluidity,” states Cohen. “A toy should grow with a child. It should play across cultures,” he adds. “A toy a child loves is a great way to reconnect.”

So, get down on the floor and play with your kids. You never know, you just may have fun!

-- KevinJarnot - 09 Dec 2004

LG GSA-4163B Triple Format Double Layer DVD Writer

Media Compatability

Specs

Write (CD-R) : 4X, 8X, 16X, 24X, 32X, 40X
(CD-RW) : 4X, 8X, 10X, 16X, 24X
(DVD-R) : 2X, 4X, 8X,16X
(DVD-RW) : 1X, 2X, 4X, 6X
(DVD+R) : 2.4X, 4X, 8X, 12X 16X
(DVD+RW) : 2.4X, 4X, 8X
(DVD-RAM): 2X, 3X, 5X(Ver.2.2)
(DVD+R Double layer): 2.4X, 4X
Read (CD-ROM/R) : 40X max
(CD-RW) : 40X max
DVD-ROM)(Single/Dual) :16X/8X max
(DVD+/-RW) : 8X max
(DVD+/-R) : 10X max
(DVD-VIDEO) : 8X max
(DVD-RAM) :2X, 3X, 5X(Ver.2.2)
(DVD+R Double layer):8X
Transfer Rate CD-ROM : 6000 Kbytes/s (40X max)
DVD-ROM : 22160 Kbytes/s (16X max)
Access Time CD-ROM: 125msec
DVD-ROM : 145msec
DV-RAM : 165msec
Buffer Size 2MB
Interface Internal E-IDE/ ATAPI
Supported Formats DVD-R/RW : Disk-at-once, incremental recording, Restricted overwrite(DVD-RW only)
DVD+RW/RAM : Random Write
DVD+R : Sequential Recording
CD-R/RW : Disk-at-once, Track-at-once, Session-at-once, Packet write
Supported Disc Write : DVD-RAM, DVD-R/RW, DVD+R/RW, CD-R/RW
Read : DVD-RAM, DVD+R/RW, DVD-R/RW, DVD-ROM, CD-R/RW, CD-ROM Mode 1,2, CD-DA, CD-I FMV, CD-
ROM XA, Mixed CD, CD Extra, CD Text, CD-Plus, Photo-CD, Video CD
Size (WxDxH) 146 x 41.3 x 184.7 mm
OS Support Window 98SE, ME, 2K Professional, XP Home Edition, Professional
Warranty 1 Year Manufacturer
-- KevinJarnot - 29 Mar 2005

LG VX6000

Links

Misc

  • The phone uses r5g6b5 bitmap format.
  • Bitmaps are 120x131, 16 bit color depth.
  • Sound files must be under 30K.
  • Bitmap hint:
If you have photoshop (or any program that can produce flipped bitmaps with r5g6b5 bitmaps), crop your images to 120x131. Save as bitmap and use advanced settings to select r5g6b5 and flipped row order. Open the resulting file with a hex editor and remove the first 54 bytes, then add 0x78008300 to the beginning of the file. Additionally remove the last 2 bytes which should be 0x0000. Now send this to your phone to replace wallpaper.bit, poweron.bit or poweroff.bit. My wallpaper does not contain any white space except for where it's supposed to be in the picture.

How to turn on "speakerphone" mode

Initial Preparation: One-time Setup

It requires a little bit of initial setup which can be a little bit of a pain. Basically you need to make sure you have a voice ringer on your phone. The easiest way to produce one of these is to go into the Voice Memo feature, record a quick memo (can be silence if you like), save it, then go into Send Pix Message in the Camera mode, enter your cell number as the destination, go down to Sound, hit OK, choose Voice Memo, and select the memo you just recorded. Send it. When you receive the message, select Save Sound from the options menu and enter a name of some sort.

Starting Speakerphone Mode

Now you're all set. To initiate Speakerphone mode, you need to press and hold the * key twice to throw the phone in Silence All mode. Go into your My Media menu (Menu + 7), Music (2), and scroll down to the voice memo you saved as a voice ringer. Let the phone sit there for a few seconds, then hit End to return to the main screen.

If you like, you can now hold * a few seconds to exit Silence All mode.

Place a call. To turn the Speakerphone on, press any key.

Drawbacks/Bugs/Needs Further Investigation

The press-any-key-to-go-speakerphone functionality seems to remain active, surviving power-cycles, until you remove the battery. I haven't found a way to turn off this functionality without killing power to the phone, but then again, most of my work tonight has been focused on getting the phone INTO speakerphone mode, not out of it.

Obviously, this is better suited for use as a "toy" feature more than something that will appeal to die-hard speakerphone fans, since there's no way to toggle the speakerphone off during a call. You need to pop the battery off and reboot. But, again, I'm sure someone else will find a way around this and will post it here (e-mailing me a copy of the details while they're at it, of course).

How to use VX6000 as modem

http://www.howardforums.com/showthread.php?s=6eb34f887df68c515b2b1017a766b460&threadid=200851
  • Purchase the LG1200 cablecable from futuredial.
  • Install the Prolific USB driver which is included on the CD. It will install the driver on COM4 by default.
  • Set the phone to
    • Menu/(9)Settings/(6)1xData/(2)Select Port = RS232C(COM Port)
    • Menu/(9)Settings/(6)1xData/(3)Port Speed = 115200

You may need to repeat step 3 as the phone sometimes reverts to USB.

  • In the Device manager under ports set the Prolific USB-to-Serial Comm Port (COM4) speed to 115200 as well.
  • Now if you have the Verizon Dialer you can install it and it will add a modem, and 2 dialup connections.
  • The modem name is "Verizon Wireless Phone HS (1xRTT)"

Dialup Connections are Express Network (1XRTT) and Quick 2 Net (14.4kbps)

Both are configured to use the modem above.

  • If you do not have the Verizon Dialer software, you can get to the same point by adding a generic 33.6K modem and adding the initialization string: AT$QCMDR=3
  • Place this modem on COM4 or whatever port your cable is on.
  • Next create a dialup connection using the modem above and use

I think to get the 14.4 Quick 2 Net connection use the

    • Phone Number: #777
    • Username: qnc
    • Password: qnc

or

    • Phone Number: your dialup isp #
    • Username: your dialup isp id
    • Password: your dialup isp pwd

-- KevinJarnot - 30 Nov 2004

LG VX8100 Stuff

Info

Application to import up to 155 ringtones into "My Ringtones"

This application’s main purpose is to allow you to load up to 155 ringtones in your “My Ringtones” folder on your phone. It’s about as simple as one could ask for. First, you will need the data cable and BitPim?. I’ll demonstrate two scenarios here. I don’t have my miniSD card yet, but this should work PERFECTLY!

• You have a miniSD card with your MP3s loaded in the my_sounds subfolder on the card.

  1. Open the VX8100 ringtone application
  2. Choose the drive letter of your miniSD card using the drop down box for the drive letter (this assumes you have a SD card reader. If you don’t, you’ll need to keep a mirror of all files you have on your SD card in a specific local hard drive folder.)
  3. Browse to the my_sounds subfolder
  4. All of your MP3s should show up in the right browser pane.
  5. Make sure the “Path on phone” is listed as “mmc1/my_sounds/”
  6. Click “Go”
  7. The file you need (my_ringtone.dat) will be created IN a folder beneath the one you’ve browsed to. The application will tell you where it is. Keep in mind where it’s at.
  8. Open BitPim?, go to the /dload folder, and right-click the my_ringtone.dat and choose “Overwrite”. Browse to the one you made a note of, and go!
You don’t even need to reboot the phone, you’re done! Install the miniSD card and you should be all set!

• You don’t have a miniSD card and want to load a bunch of ringtones – MIDI, MP3, or what not.

  1. I recommend that you create a folder on the phone’s filesystem called “/ring”. This allows us to have longer song file names .
  2. Browse to the folder on your computer that you have exactly the same files you have in whatever folder on your phone. (For example, you’ve copied a bundle of files to /ring/song1.mp3 /ring/song2.mp3 etc on the phone. Browse to a local folder on your computer where song1.mp3, song2.mp3, etc. are located. Basically keep a mirror on your computer)
  3. Choose or type the folder name using the “Path on phone” box. Don’t put a preceding “/” in that box, use the same naming scheme as the predefined selections.
  4. Click “Go”
  5. The file you need (my_ringtone.dat) will be created IN a folder beneath the one you’ve browsed to. The application will tell you where it is. Keep in mind where it’s at.
  6. Open BitPim?, go to the /dload folder, and right-click the my_ringtone.dat and choose “Overwrite”. Browse to the one you made a note of, and go!

All set! No need to reboot the phone, just open your menu and browse for the ringtones!! After I loaded 252 of them I realized it sucks you can’t use the first character to skip down. I actually loaded about 7 MB of plain MIDI files on my phone, just for proof of concept. When my 1GB miniSD comes in, I’ll load the real songs up!

Hope I covered everything here. Please keep questions in the thread that way I can answer for everyone else to see as well. A dedicated mirror/host for this installer would be cool too. I’ll host it for now unless I start to get hit too hard with downloads.

Download Installer.

Feel free to ask questions or give suggestions… And I’m sure there are things you can do to make it crash if everything isn’t done just right, but hey I put it together in a few hours so… Everyone post your comments and let me know if it works OK for you.

Links

Free Midi and MP3 Ringtones

Free Ringtones, Videos, Wallpaper and MP3 files

Tutorials Text Info Files

-- KevinJarnot - 20 Sep 2005

Linux

-- KevinJarnot - 02 Jan 2005

List of Simple Web Site Hosting Options

Last updated 20050923

Free

Not Free

-- KevinJarnot - 23 Sep 2005

Loving Guidance

Articles

-- KevinJarnot - 09 Dec 2004

Mag Innovision DX700T Monitor

CRT Size/Type 17"(16.0" viewable), dark tinted, anti-static coated, Trinitron ® SA CRT with dynamic focus and low electromagnetic field, (Anti-Glare, Anti-Static, Anti-Reflective)
Aperature Grille 0.25 mm
Maximum Resolution 1280 (H) x 1024 (V) Non-interlaced (Addressable)
Compatibility VESA DDC1/2B VESA 1280x1024NI @ 60 Hz, VESA 1024x768NI @ 85 Hz/75Hz/70Hz/60Hz, VESA 800x600 @ 85Hz/75Hz/70Hz/60Hz, Apple* 1152 x 870 @ 75Hz, Apple 1024x768 @ 75Hz, Apple 832x624 @ 75Hz, XGA/2, Super VGA 800x600 @ 56/60 Hz, VGA, SPARC*, and more
Display Colors Unlimited
Vertical Scan Range Auto-synchronizing 50-120 Hz
Horizontal Scan Range Auto-synchronizing 30-70 kHz
Bandwidth 100 MHz (-3 db) nominal
Active Display Area 300 (H) x 220 (V) mm [11.61" x 8.46"]
Default Overscan 328 (H) x 242 (V) mm [12.91" x 9.76"]
Input Signal VIDEO: Analog 0.7 V P-P /75 Ohm, SYNC: SEPARATE: TTL Level COMPOSITE: TTL Level
Input Connector/Cable 15 pin mini D-sub
User Control On-Screen Display (OSD): Brightness, Contrast, Horizontal Phase, Horizontal Size, Vertical Position, Vertical Size, Overscan capability Allows the use of more screen as display area. Pincushion, Trapezoid, Rotation, OSD Position, Degaussing, Recall Program, Advanced Functions: Bowing, Parallelogram, Corner Adjustment, S-Curve, Horizontal and Vertical Convergence, Color Correction Circuitry: 9300k, 6500k, 5500k, Red, Green, Blue Adjustments
Power Supply 90-130 V /60 Hz 2A or 180-260 V /50 Hz 1A Auto-switching VESA DPMS and EPA Energy Star Compliant On: 130 W maximum; Suspend: 20 W maximum; Off: 8 W maximum
Environmental Conditions Operating Temperature: 0-40°C (32-104°F) Operating Humidity: 10-90% Operating Altitude: 0-10,000 feet
Tilt and Swivel Base Removable 4-way ergonomic tilt and swivel base
Dimensions (Overall) 409 (W) x 421 (H) x 464 (D) mm [16.1" x 16.7" x 18.2"]
Weight 46.7 lbs (net),53.3 lbs (gross)
Certifications FCC Class B, CE, UL, FTZ, MPR II, CSA, DHHS, NEMKO, DEMKO, SEMKO, TUV/GS,
Warranty Three years on parts, two years on CRT, one year on labor

Links

-- KevinJarnot - 03 Jan 2005

Managed Services or DIY?

Colocation is a must-have for any site that is large and complex enough that it can't be run on so-called dedicated servers. The big question for these sites is whether to go with pure colocation or to employ the services of a managed service provider (MSP), the newest breed of Web-hosting services.

As you move up the Web-hosting ladder from shared-to dedicated-server Web-hosting services, you'll encounter increased levels of vendor service and support. But when you take the next step—to colocation—you'll discover you're on your own when it comes to building and managing your Web site.

It's like moving from renting an apartment to owning your own home. In the apartment days, maintenance was someone else's problem. But now that you've got the freedom to do whatever you want, you've also got the responsibility. In some ways it seems like a step backward.

As an alternative to do-it-yourself management, you can use a colocation vendor for the low-level service it provides, and outsource the more sophisticated care and feeding of your servers to an MSP. This combination is becoming increasingly popular.

You need to be aware, however, that many colocation vendors and independent MSPs have a love/hate relationship with one another. On one hand, the colocation vendors appreciate the MSPs because the MSPs bring in customers. On the other hand, the colocation vendors hate the fact that the MSPs make more money from those customers than do the colocation vendors themselves. The colocation vendors also know that the customer's loyalty is to the MSP first (because of the higher-value relationship the customer has with the MSP), and only coincidentally to the colocation vendor.

Why don't the colocation vendors offer managed services? In fact, many do offer them now, but only recently. It's a reaction to the success of the independent MSPs (some of which were acquired by the colocation vendors), and a way to enter the MSP business. But for years, although customers screamed that they needed such help, colocation vendors simply couldn't provide managed services themselves. The reason comes back to a recurring issue: The skills that are required to provide good power, pipe, and ping (colocation) are very different from those required to support and manage servers and applications. Even the cultures of such organizations are very different. (Just imagine calling your phone company's service center for help with a database performance problem, and you'll understand the difference.)

Some colocation vendors intend to expand into the MSP business as soon as possible, and it's only a matter of time before they effectively sever their relationships with the independent MSPs that are currently their partners.

VENDOR SELECTION TIPS Investigate carefully the relationship between the colo and the MSP, as it's very possible that those that are partners today will become competitors tomorrow. You‘re going to be stuck with the MSP, and if its new customers are at a different facility than its old ones (including you), you'll become a second-class customer, or be forced to move your site.

If you want to use an independent MSP, don't make the mistake of first selecting a colocation facility (perhaps because a particular one is physically close to you) and then asking that vendor to recommend an MSP. The response you get will be self-serving. Colocation vendors will only recommend MSPs that use their facilities; hence, you'll only be exposed to a subset of the potential MSPs.

Also, by getting a referral to an MSP in this manner, you'll effectively eliminate the MSP's objectivity when it comes time to select a colocation facility. Few MSPs will take a referral from a colocation vendor, then turn around and suggest that you locate your site somewhere else. An MSP only gets to do that once or twice before the colocation vendor gets the idea that its referral network isn't working too well, and starts recommending a different MSP.

If you plan to use a facility-neutral MSP, select it before you select the colocation service. Give the MSP latitude to recommend the colocation service(s) it works with best.

-- KevinJarnot - 07 Jan 2005

Managing Your Boss

Techniques

Articles

-- KevinJarnot - 07 Jan 2005

How to Migrate from TestTrack Pro to Bugzilla

I had decided to migrate my engineering group from Seapine's expensive TestTrack Pro product (version 5) to the free Bugzilla defect tracking system (version 2.18.1). Here's an overview of how I did it.

Export Test Track Pro database to XML file

Easy enough - click on XML Export and save the defects to an XML file.

Transform the TT XML file to Bugzilla's XML format

I used the XSLT Library for GNOME under http://www.cygwin.org. Other EXSLT-compliant XSLT processors should also work.

xsltproc -o out.xml tt2bz.xsl tt.xml

where out.xml is the output XML file (defects in Bugzilla XML format), tt2bz.xsl is the script listed below, and tt.xml is the file containing the exported TestTrack defects.

Load the defects into Bugzilla

Bugzilla comes with a Perl script named importxml.pl. Simply run:

perl importxml.pl out.xml

The defects should (hopefully) now be imported into Bugzilla.

The XSLT script

This will require some modification to fit your needs/data.

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"      
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="exsl str"      
version="1.0">

<xsl:output method="xml"/>

<!-- Update this mapping with your data.  It maps TT usernames to BZ accts. -->
<xsl:variable name="emailMap">
<map ln="User1" email="user1@domain.com"/>
<map ln="User2" email="user2@domain.com"/>
<map ln="User3" email="usere@domain.com"/>
</xsl:variable>
<xsl:variable name="emailmaps" select="exsl:node-set($emailMap)/map"/>


<!-- Update this mapping with your data.  It maps TT products/components to BZ's -->
<xsl:variable name="prodMap">
<map ttprod="TT Product1"         ttcomp="*" bzprod="BZ - Product1" bzcomp="BZ - Comp1"/>
<map ttprod="TT Product2"         ttcomp="*" bzprod="BZ - Product1" bzcomp="BZ - Comp2"/>
</xsl:variable>
<xsl:variable name="prodmaps" select="exsl:node-set($prodMap)/map"/>

<xsl:template match="/TestTrackData">
<bugzilla version="2.18.1" urlbase="http://domain.com/testtrack/" maintainer="me@domain.com" exporter="me@domain.com">
<xsl:apply-templates select="defect"/>
</bugzilla>
</xsl:template>

<xsl:template match="defect">
<xsl:variable name="_finalData">
<xsl:apply-templates select="*" mode="normalize"/>
</xsl:variable>
<xsl:variable name="finalData" select="exsl:node-set($_finalData)"/>

<bug>
<!-- Explicitly apply templates to preserve ordering in BZ data -->
<!--       -->
<xsl:apply-templates select="$finalData/defect-number"/>
<xsl:apply-templates select="$finalData/defect-date"/>
<xsl:apply-templates select="$finalData/summary"/>
<xsl:apply-templates select="$finalData/date-last-modified"/>
<!-- 1 -->
<!-- 1     -->
<xsl:apply-templates select="$finalData/product"/>
<xsl:apply-templates select="$finalData/component"/>
<version>unspecified</version>
<rep_platform>Other</rep_platform>
<op_sys>other</op_sys>
<xsl:apply-templates select="$finalData/defect-status"/>
<xsl:apply-templates select="$finalData/priority"/>
<xsl:apply-templates select="$finalData/severity"/>
<target_milestone>---</target_milestone>
<xsl:apply-templates select="$finalData/entered-by/email-address"/>
<!--       -->
<xsl:apply-templates select="$finalData/currently-assigned-to"/>
<xsl:apply-templates select="$finalData/reported-by-record/description"/>
<xsl:apply-templates select="$finalData/*/notes"/>
</bug>
</xsl:template>

<xsl:template match="*" mode="normalize">
<xsl:copy>
<xsl:apply-templates select="* | text()" mode="normalize"/>
</xsl:copy>
</xsl:template>

<xsl:template match="text()" mode="normalize">
<xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="foo" mode="normalize">
<foo>
<!-- Add attributes, other elements, transform this element, format it, whatever -->
</foo>
</xsl:template>

<xsl:template match="defect-number">
<bug_id><xsl:value-of select="."/></bug_id>
</xsl:template>

<xsl:template match="summary">
<short_desc><xsl:value-of select="."/></short_desc>
</xsl:template>

<xsl:template match="product">
<xsl:variable name="_prod" select="."/>
<xsl:variable name="_comp" select="../component"/>

<xsl:comment>Prod: <xsl:value-of select="$_prod"/></xsl:comment>
<xsl:comment>Comp: <xsl:value-of select="$_comp"/></xsl:comment>

<!-- Handle special case (reverse) lookup for DXMark -->
<xsl:variable name="comp">
<xsl:choose>
<xsl:when test="$_prod = 'DXMark'">
<xsl:value-of select="$prodmaps[@ttcomp = $_comp]/@bzcomp"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$prodmaps[@ttprod = $_prod]/@bzcomp"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="_prodlookup" select="$prodmaps[@ttprod = $_prod]/@bzprod"/>
<product><xsl:value-of select="$_prodlookup"/></product>
<component><xsl:value-of select="$comp"/></component>
</xsl:template>

<xsl:template match="priority">
<xsl:comment>Prio: <xsl:value-of select="."/></xsl:comment>

<priority>
<xsl:choose>
<xsl:when test=". = '** Show-stopper **'">P1</xsl:when>
<xsl:when test=". = 'Immediate'">P2</xsl:when>
<xsl:when test=". = 'Soon'">P3</xsl:when>
<xsl:when test=". = 'Later'">P4</xsl:when>
<xsl:when test=". = 'Future Release'">P5</xsl:when>
</xsl:choose>
</priority>
</xsl:template>

<!-- RESOLUTION/STATUS -->

<!-- Default map for resolutions.  -->
<xsl:template match="defect-status" mode="resolution-map"/>

<!-- Map for defect-status is "Closed" or "Fixed" -->
<xsl:template match="defect-status[contains(., 'Closed') or contains(., 'Fixed')]" mode="resolution-map">
<map bzstatus="CLOSED" ttres="Code Change" bzres="FIXED"/>
<map bzstatus="CLOSED" ttres="Documentation Change" bzres="FIXED"/>
<map bzstatus="CLOSED" ttres="Clarification" bzres="FIXED"/>
<map bzstatus="CLOSED" ttres="Not Out Bug" bzres="INVALID"/>
<map bzstatus="CLOSED" ttres="Not a Bug" bzres="INVALID"/>
<map bzstatus="CLOSED" ttres="On Hold" bzres="LATER"/>
<map bzstatus="CLOSED" ttres="Duplicate" bzres="DUPLICATE"/>
</xsl:template>

<xsl:template match="defect-status[. = 'Open']">
<bug_status>ASSIGNED</bug_status>
</xsl:template>

<!-- Map for defect-status is "Released to Testing" -->
<xsl:template match="defect-status[. = 'Released to Testing']" mode="resolution-map">
<map bzstatus="RESOLVED" ttres="Code Change" bzres="FIXED"/>
<map bzstatus="RESOLVED" ttres="Documentation Change" bzres="FIXED"/>
<map bzstatus="RESOLVED" ttres="Clarification" bzres="FIXED"/>
<map bzstatus="RESOLVED" ttres="Not Out Bug" bzres="INVALID"/>
<map bzstatus="RESOLVED" ttres="Not a Bug" bzres="INVALID"/>
<map bzstatus="RESOLVED" ttres="On Hold" bzres="LATER"/>
<map bzstatus="RESOLVED" ttres="Duplicate" bzres="DUPLICATE"/>
</xsl:template>


<xsl:template match="defect-status">
<xsl:comment>Stat: <xsl:value-of select="."/></xsl:comment>

<xsl:variable name="_maps">
<xsl:apply-templates select="." mode="resolution-map"/>
</xsl:variable>
<xsl:variable name="maps" select="exsl:node-set($_maps)/map"/>

<!-- Default resolution to "Code Change" if not present -->
<xsl:variable name="resolution">
<xsl:choose>
<xsl:when test="../fix-event/resolution">
<xsl:value-of select="../fix-event/resolution"/>
</xsl:when>
<xsl:otherwise>Code Change</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:comment>Reso: <xsl:value-of select="$resolution"/></xsl:comment>

<resolution>
<xsl:choose>
<xsl:when test="$maps">
<xsl:value-of select="$maps[@ttres = $resolution]/@bzres"/>
</xsl:when>
<xsl:otherwise>DEF_RES</xsl:otherwise>
</xsl:choose>
</resolution>

<bug_status>
<xsl:choose>
<xsl:when test="$maps">
<xsl:value-of select="$maps[@ttres = $resolution]/@bzstatus"/>
</xsl:when>
<xsl:otherwise>DEF_STATUS</xsl:otherwise>
</xsl:choose>
</bug_status>
</xsl:template>

<!-- SEVERITY - map TT.severity to BZ.severity -->
<xsl:template match="severity" mode="severity-map">
<map ttsev="Causes Crash" bzsev="critical"/>
<map ttsev="No Workaround" bzsev="major"/>
<map ttsev="Workaround" bzsev="minor"/>
<map ttsev="Cosmetic" bzsev="trivial"/>
</xsl:template>

<xsl:template match="severity">
<xsl:comment>Seve: <xsl:value-of select="."/></xsl:comment>

<xsl:variable name="_maps">
<xsl:apply-templates select="." mode="severity-map"/>
</xsl:variable>
<xsl:variable name="maps" select="exsl:node-set($_maps)/map"/>

<bug_severity>
<xsl:choose>
<xsl:when test="$maps">
<xsl:value-of select="$maps[@ttsev = current()/.]/@bzsev"/>
</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</bug_severity>
</xsl:template>

<!-- REPORTER - map TT.entered-by/last-name to bz.reporter -->
<xsl:template match="entered-by/last-name" mode="normalize">
<xsl:copy>
<xsl:apply-templates select="* | text()"/>
</xsl:copy>
<email-address>
<xsl:call-template name="getemail">
<xsl:with-param name="ln" select="."/>
</xsl:call-template>
</email-address>
</xsl:template>

<xsl:template match="entered-by/email-address">
<reporter><xsl:value-of select="."/></reporter>
</xsl:template>

<!-- CREATION_TS - map TT.date-entered to BZ.creation_ts -->
<!-- Note that we need to convert TT's MM/DD/YY format to BZ's YYYY-MM-DD HH:MM -->
<!-- We'll default the time to midnight - TT did not capture the time... -->
<xsl:template match="date-entered" mode="normalize">
<xsl:copy>
<xsl:apply-templates select="* | text()"/>
</xsl:copy>

<defect-date>
<xsl:call-template name="convdate">
<xsl:with-param name="date" select="."/>
</xsl:call-template>

</defect-date>
</xsl:template>

<xsl:template match="defect-date">
<creation_ts><xsl:value-of select="."/></creation_ts>
</xsl:template>

<!-- Description -->
<xsl:template match="reported-by-record/description">
<long_desc>
<who><xsl:value-of select="../../entered-by/email-address"/></who>
<bug_when>
<xsl:call-template name="convdate">
<xsl:with-param name="date" select="../date-found"/>
</xsl:call-template>
</bug_when>
<thetext><xsl:value-of select="."/></thetext>
</long_desc>
</xsl:template>

<!-- assigned-to -->
<!-- Grab value from currently-assigned-to.  If empty, grab last assigned-to -->
<xsl:template match="currently-assigned-to">
<xsl:variable name="curr-name" select="./last-name"/>
<xsl:variable name="ass-name" select="(parent::*/assign-event/assigned-to/last-name)[last()]"/>

<xsl:comment>Assi: "<xsl:value-of select="$curr-name"/>" or "<xsl:copy-of select="$ass-name"/>"</xsl:comment>

<xsl:variable name="curr-email">
<xsl:call-template name="getemail">
<xsl:with-param name="ln" select="$curr-name"/>
</xsl:call-template>
</xsl:variable>

<xsl:variable name="email">
<xsl:choose>
<xsl:when test="contains($curr-email,'@')">
<xsl:value-of select="$curr-email"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="getemail">
<xsl:with-param name="ln" select="$ass-name"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:variable name="final-email">
<xsl:choose>
<xsl:when test="contains($email,'@')">
<xsl:value-of select="$email"/>
</xsl:when>
<xsl:otherwise>default@domain.com</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<assigned_to><xsl:value-of select="$final-email"/></assigned_to>
</xsl:template>

<!-- date-last-modified -->
<xsl:template match="date-last-modified">
<delta_ts>
<xsl:call-template name="convdatetime">
<xsl:with-param name="datetime" select="."/>
</xsl:call-template>
</delta_ts>
</xsl:template>


<!-- Add any other notes.  Be sure to skip any notes with text -->
<!-- "This assignment was auto generated by TestTrack."        -->
<xsl:template match="notes">
<xsl:if test=". != 'This assignment was auto generated by TestTrack.'"> 
<long_desc>
<who>
<xsl:call-template name="getemail">
<xsl:with-param name="ln" select="../*/last-name"/>
</xsl:call-template>
</who>
<bug_when>
<xsl:call-template name="convdate">
<xsl:with-param name="date" select="../event-date"/>
</xsl:call-template>
</bug_when>
<thetext>
<xsl:value-of select="."/>
</thetext>
</long_desc>
</xsl:if> 
</xsl:template>

<!-- Incl. TT disposition and type in output for future ref -->
<xsl:template match="disposition">
<tt_disposition><xsl:value-of select="."/></tt_disposition>
</xsl:template>

<xsl:template match="type">
<tt_type><xsl:value-of select="."/></tt_type>
</xsl:template>

<!-- Throw away everything else... -->
<xsl:template match="*"></xsl:template>

<!-- Map last name to email address -->
<xsl:template name="getemail">
<xsl:param name="ln"/>

<xsl:variable name="email-addr">
<xsl:value-of select="$emailmaps[@ln = $ln]/@email"/>
</xsl:variable>

<xsl:value-of select="$email-addr"/>
</xsl:template>

<!-- Template for converting MM/DD/YY to YYYY-MM-DD HH:MM format -->
<xsl:template name="convdate">
<xsl:param name="date"/>

<xsl:variable name="date-nodes" select="str:tokenize($date, '/')"/>
<xsl:variable name="new-day" select="str:align($date-nodes[2], '00', 'right')"/>
<xsl:variable name="new-month" select="str:align($date-nodes[1], '00', 'right')"/>
<xsl:variable name="new-year" select="str:align($date-nodes[3], '2000', 'right')"/>
<xsl:value-of select="concat($new-year, '-', $new-month, '-', $new-day, ' ', '00:00')"/>
</xsl:template>

<!-- Template for converting MM/DD/YY HH:MM to YYYY-MM-DD HH:MM format -->
<xsl:template name="convdatetime">
<xsl:param name="datetime"/>

<xsl:variable name="datetime-nodes" select="str:tokenize($datetime, ' ')"/>
<xsl:variable name="date-portion" select="$datetime-nodes[1]"/>
<xsl:variable name="time-portion" select="$datetime-nodes[2]"/>
<xsl:variable name="ampm"         select="$datetime-nodes[3]"/>

<xsl:variable name="date-nodes" select="str:tokenize($date-portion, '/')"/>
<xsl:variable name="new-day" select="str:align($date-nodes[2], '00', 'right')"/>
<xsl:variable name="new-month" select="str:align($date-nodes[1], '00', 'right')"/>
<xsl:variable name="new-year" select="str:align($date-nodes[3], '2000', 'right')"/>

<xsl:variable name="time-nodes" select="str:tokenize($time-portion, ':')"/>
<xsl:variable name="hour" select="$time-nodes[1]"/>
<xsl:variable name="min" select="$time-nodes[2]"/>

<xsl:variable name="new-hour">
<xsl:choose>
<xsl:when test="$ampm='PM'">
<xsl:value-of select="$hour+12"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$hour"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:value-of select="concat($new-year, '-', $new-month, '-', $new-day, ' ', $new-hour, ':', $min)"/>

</xsl:template>

</xsl:stylesheet>

-- KevinJarnot - 12 Jul 2005

Misc Exercises

Speed Bag

The purpose of a speed bag is to improve hand-eye coordination. When using the speed bag, it is important to wear hand wraps or bag gloves to protect your hands.

  1. Make sure that the positioning of the speed bag is adjusted for your height. The bottom of the bag should be level with the bottom of your chin. Usually, speed bag platforms are easily adjustable. Address the speed bag square with the body, both fists up and in front of the face. This is the one time you do not have to be in the boxer's stance.
  2. To perform a backhand punch, hit the lower part of the striking bag with the side of your fist (near your little finger).
  3. The bag will swing back, hit the backboard, come forward, hit the backboard, swing back, and hit the backboard. When the bag comes forward again, strike it with a backhand or straight punch. This may seem tricky at first, but be patient and eventually, you will master the rhythm.
  4. Repeat striking the bag with the PUNCH-1-2-3 rhythm, keeping both hands up by the face. Work with one fist, then the other, taking the arm through a circular motion. As you punch faster tighten up this circular range of motion that the arm goes through. Practice hitting the bag with both hands.
  5. The most important thing is to be patient. When first starting, the speed bag will probably go all over the place. If it goes in circles, try hitting it softer. If it is barely moving, simply strike it harder. Eventually, you will get a feel for the bag and be able to speed up your punches and alternate between hands. It's all a matter of timing.

If the bag is moving too fast, try a larger-sized bag or let some air out of the bladder to slow it down.

Heavy Bag

  1. After wrapping your hands, put on a suitable pair of bag gloves. Gloves will help absorb the shock of your punches and protect your hands from abrasion.
  2. Extend your arm so that your glove touches the heavy bag. Determine your reach or your punching distance. Execute a jab. As the arm is extended, the glove should be in tight contact with the bag. Repeat a few times to become comfortable with the feel. Remember the following when striking the heavy bag, ALWAYS...
    1. Clench your fists.
    2. Make sure your wrists are straight.
    3. Keep your elbows slightly flexed.
    4. Turn with your shoulders.
    5. Twist at the waist.
    6. Push with your hips and toes.
    7. Keep your knees bent.
  3. Focus and hit in the center of the bag. Each time you throw a punch, exhale. This will help regulate your breathing and give you some extra mmphh! Many athletes believe that exhaling makes it less likely to get your wind knocked out.
  4. Watch as the bag moves away and hit it directly and quickly as it returns to you. Mix up the straight punches, a few jabs and then a straight right. Always try to punch through the heavy bag, rather than at it.
  5. Next, add movement and more power. Step into the punches and step out. The glove hand moves forward as the front foot moves forward. The glove returns back to the shoulder as the back foot returns back.
  6. Now have a plan and mix it up a bit. Move around, slip and throw a few jabs to determine your reach and target area. Move in closer to the bag and throw hooks and uppercuts.

Straight-Right Punch

  1. After establishing your stance, shift your weight to your left leg. Pivot your right (rear) foot so that your toes are pointing forward, while simultaneously delivering a right punch. Remember to push against the floor with your rear foot. (At the very last moment, rotate your fist so that your palm is facing the floor.)
  2. Pull your hand back on the same plane the punch was thrown. Return your rear foot to its original position-toes pointing between 12 and 2 o'clock.

Hook

Unlike the other punches, the hook is a bent-arm punch. The power of this punch is generated by a move known as a body whirl. In order to perfect this punch, try to master each movement one step at a time before going on to the next step.
  1. Stand with your feet shoulder width apart. Your weight should be equally distributed between your feet. Bring your fists together and hold them against your chest (with palms facing your chest).
  2. Shift your weight to your right leg while simultaneously rotating your body to the right. Pivot on the ball of your left foot so that your toes end up pointing toward your right foot. You will notice that this movement causes your arms to move along with it. Stop rotating when your elbow reaches about the midpoint in front of you.
  3. Try this move again with a slight variation. Shift your weight to the right foot. Pivot on the ball of you left foot until your toes point toward your right foot. Immediately, snap your left arm up into a ninety-degree angle. Your left fist should stop at a midpoint in front of you. This is called a lateral punch. The power of the hook comes from the momentum of your body rotating and the resistance of your foot pushing off of the floor. At this point, the left side of your torso should be in line with the direction of your punch.
  4. Return your left foot back to its original position and bring your left fist back to its cheek level position.

The Right hook and left hook are virtually the same. The only difference is that you rotate your body in opposite directions.

Jab

This punch has many purposes: To increase the distance between you and your opponent. To set up other punches and punch combinations. Or, simply to land a solid blow to your opponent's face.
  1. (The jab is always thrown with your forward hand) Shift most of your weight onto your right (back) leg. This assists in counterbalancing your body when you throw the punch.
  2. Fully extend your arm. Just before your fist/glove strikes the target, rotate your hand so that your palm is facing the floor. Remember to keep your wrists straight to avoid injury. Also, keep your elbow slightly flexed at the point of impact (otherwise, you might hyperextend it).
  3. Return your arm back to your body. Remember, the punch always remains on one plane—throw and retract your punch without weaving up or down or side to side.
  4. Do not allow your shoulders to lead. This may cause you to bend at the waist when making your punch. Keep your shoulders back.
  5. When throwing your jab, keep your muscles slightly tensed. Anchor your punch by contracting your back and butt muscles. It is important that the movement of your feet coincides with the movement and placement of your punch. Properly stepping with the jab will ensure that your punch is effective.

When punching with your left hand, step forward with your left foot. As your foot contacts the floor, your arm should reach its full extension. (Remember to keep your elbow flexed when throwing this punch.) At this point, your weight is primarily distributed to your right leg. Now, you have invaded your opponent's space and delivered a punch to their face. After completing the punch, return your arm to its position level with your left cheek. Bring your rear foot up so that your feet are in their correct, original stance, slightly more than shoulder width apart.

Uppercut

  1. To throw a right uppercut, start in the classic boxing stance with the back (right) knee bent. Lower the right shoulder to drop the right side of the body in a semi-crouch position. Remember to keep the left fist up by the chin to protect the head.
  2. Now as you rotate the hips forward, push the ball of the back foot, (the right foot), and punch the right fist up towards the target. The right side of the back a